CF1582F Korney Korneevich and XOR


CodeforcesF1
CodeforcesF2
LuoguF1
LuoguF2

Description.

有一個長度為 \(n\) 的序列,求每個嚴格遞增子序列異或值的並。

F1 : \(n\le 10^5,V\le 500\)
F2 : \(n\le 10^6,V\le 5000\)

Solution.

F1 有手就行,直接做,做完了。
大概就是記 \(dp_i\) 表示當前 \(\oplus\) 值為 \(i\) 的點的結束位置最小值。
每次枚舉一遍值域就行了,總復雜度 \(O(nV)\) 可以過 F1。


F2 以 \(\oplus\) 值建圖。
這張圖有 \(O(nV)\) 條邊,有 \(O(V^2)\) 個點。
而且是一個分層圖,從第一層出發走問能否走到某層的指定頂點。
我們考慮 \(O(V^2)\) 的做法,嘗試讓 \(O(nV)\) 個冗余狀態消失。
考慮一個點,它第一遍被更新肯定是最優的,也就是說,只要一個點被更新過,那它狀態就確定了。
那我們考慮只讓每個點被更新一次,這樣復雜度就真了。
我們考慮那些 \(O(nV)\) 的邊其實有性質,都是 \((a,qwq)\rightarrow (a\oplus t,t)\) 的邊。
所以如果對 \((a,?)\) 已經向 \((a\oplus t,t)\) 更新過了,那剩下所有邊都不需要了。
而且這個邊還具有單調性,也就是說每次被更新的肯定是一個后綴(因為 \(t\ge qwq\))。
所以每次更新的肯定是一段區間,然后就可以判斷這段區間有沒有被覆蓋來轉移。
均攤一下發現每個點只會被更新 \(1\) 次,總更新失敗次數 \(O(n)\) 次。
然后總復雜度就是 \(O(V^2+n)\)

考慮一下具體實現。
反過來考慮,考慮一個點更新它的所有出邊,因為優美的性質集中在目標點。
相當於我們可以預處理出 \((a,qwq)\) 可以更新到哪些點。
如果它已經被更新了那我們直接可以不管它了。
而且如果當前有一個 \((a,qwq)\)\((a,qaq)\)\(qwq\ge qaq\)\((a,qaq)\) 是無意義的。
本質上來說我們可以把某個指定點的每一層給壓起來。
然后只需要記錄當前這個點的所有層可以轉移到哪些點就行了。

Coding.

點擊查看代碼
//Coded by STUPID_JUSTlN {{{
//Gened on 2021.10.24 18:05:02
//是啊,你就是那只鬼了,所以被你碰到以后,就輪到我變成鬼了
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
template<typename T>inline void read(T &x)
{
	x=0;char c=getchar(),f=0;
	for(;c<48||c>57;c=getchar()) if(!(c^45)) f=1;
	for(;c>=48&&c<=57;c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	f?x=-x:x;
}
template<typename T,typename...L>inline void read(T &x,L&...l) {read(x),read(l...);}//}}}
int n,a[1000005],go[5005][8195],cn[8195],rs[8195],rst;
char dp[8195][5005],v[5005][8195];//走權為 i 的邊能到 j
inline void adde(int i,int j) {go[i][++cn[i]]=j;}
int main()
{
	read(n),dp[0][0]=1;for(int i=1;i<=5000;i++) adde(i,i),v[i][i]=1;
	for(int k;n-->0;)
	{
		read(k);
		for(int i=1;i<=cn[k];i++)
		{
			int tw=go[k][i];dp[tw][k]=1;
			for(int j=k+1;j<=5000;j++) if(v[j][tw^j]) break;
				else v[j][tw^j]=1,adde(j,tw^j);
		}cn[k]=0;
	}
	for(int i=0;i<8192;i++) for(int j=0;j<=5000;j++) if(dp[i][j]) {rs[++rst]=i;break;}
	printf("%d\n",rst);for(int i=1;i<=rst;i++) printf("%d%c",rs[i],i==rst?'\n':' ');
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM