看見是位運算,就知道按位考慮,看見一段連續的全是1,一段1的個數》=1,一段全是0,一段1的個數本來我以為由於可以確定哪些地方是1哪些地方是0,就按照單向邊從小到大,就不用建回來的邊,題目保證有解,那麼這樣就一定會出來一組合法解。
但通過這題的實驗,我發現少了任何一種關係的建邊,都會wa掉
而且這題如果直接跑還會超時,從yyb那裡學了一手確定是1的地方i,直接從0連到i一條sum[i]的邊,sum[i]表示已經有多少,這樣i會在比較早的時候達到乙個比較大的水平,進佇列的次數就會少很多。
字首和 dis[j]-dis[j-1]>=0 dis[j-1]-dis[j]>=-1
一段全是1 -> dis[r]-dis[l-1]>=r-l+1 dis[l-1]-dis[r]>=-(r-l+1)
一段至少有1個1 -> dis[r]-dis[l-1]>=1
一段全是0 ->dis[r]-dis[l-1]>=0 dis[l-1]-dis[r]>=0
一段不全是1 -> dis[l-1]-dis[r]>=l-r
這些連邊一條也不能少,不然就會答案錯誤。。。
然後再加上用來優化的邊才能過
#includeusing namespace std;
const int maxl=1e5+10;
int n,m,cnt;
int ans[maxl],sum[maxl],l[maxl],r[maxl],op[maxl],x[maxl];
int in1[maxl],out1[maxl],ehead[maxl],dis[maxl];
struct ed
e[maxl*5];
queueq;
bool in[maxl];
inline void add(int u,int v,int l)
inline void prework()
}inline void spfa(int id)
}} in[u]=false;
} for(int i=1;i<=n;i++)
if(dis[i]>=dis[i-1]+1)
ans[i]|=1<0);
add(0,j,sum[j]);
/*if(sum1>0)
add(j-1,j,1);
else
add(j-1,j,0);*/
add(j-1,j,0);
add(j,j-1,-1);
sum1-=out1[j];
} spfa(i);
for(int j=1;j<=n;j++)
if(dis[j]>dis[j-1])
ans[j]|=1
int main()
牛客練習賽71 E 神奇的迷宮 點分治 NTT
e 神奇的迷宮 思路 點分治 ntt裸題,ntt初始化很重要!ntt中limit,l,a陣列和b陣列都得初始化。這個題中點分治的sum和主函式中的sum求和弄混了因此一直t,心態崩了。include 注意此模板點的下標應為1到n!include include using namespace std...
牛客 劍指offer k個一組翻轉鍊錶
題目 k個一組翻轉鍊錶 思路 遞迴 遞迴函式返回已經反轉好的鍊錶 遞迴函式需要把本次翻轉好的鍊錶 鏈到 下一次翻轉好的鍊錶上。definition for singly linked list.public class listnode listnode int val listnode int v...
一組數排序
小夥伴們剛接觸到c語言程式設計時,排序肯定是會經常遇到的問題型別,這裡貼出氣泡排序和選擇排序的 氣泡排序bubble sort 動態感覺上是最大值 或最小值 經過依次遍歷後,不斷下沉 或上浮 出來。第一次遍歷,這組數最大的 或最小值 顯現出來,出現在陣列的開頭或結尾,然後可以對剩下的陣列在進行一遍操...