題目連接 //kuangbinnode
題意:ios
如今你和你的朋友正在玩一種遊戲。 你的朋友寫下一串0和1的序列,而後你選擇其中一串子序列(如[3,5])而且問他這個序列是包含奇數個1仍是偶數個1(和是奇數仍是偶數)。 你能夠問你的朋友任意個問題,而你的朋友會回答你的問題。 你的任務是猜出整個朋友的序列。可是,你發現你的朋友告訴你的信息可能有誤,因此你想寫一個程序來指出他的錯誤。這個程序應該接受一系列你的問題和答案。程序的目標是找到第一個錯誤的答案。數組
思路:spa
由以前作樹狀數組的題目經驗獲得,左區間能夠-1,使得連貫起來。.net
由於1e9很大數組開不下,因此離散化(這一步要在左區間-1的步驟以後)。code
帶權。blog
1 #include<iostream> 2 #include<cstdio> 3 #include <cctype> 4 #include<algorithm> 5 #include<cstring> 6 #include<cmath> 7 #include<string> 8 #include<cmath> 9 #include<set> 10 #include<vector> 11 #include<stack> 12 #include<queue> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define mem(a,x) memset(a,x,sizeof(a)) 17 #define se second 18 #define fi first 19 const ll mod=998244353; 20 const int INF= 0x3f3f3f3f; 21 const int N=2e5+5; 22 23 int n,m; 24 int f[N]; 25 int book[N]; 26 int sum[N]; 27 vector<int>v; 28 29 struct node 30 { 31 int f,s; 32 }a[N]; 33 string str; 34 35 int getf(int x) 36 { 37 if(x!=f[x]) 38 { 39 int t=f[x]; 40 f[x]=getf(f[x]); 41 sum[x]+=sum[t]; // 其實sum[x]^=sum[t]也行,更快,110ms 42 } 43 return f[x]; 44 } 45 int main() 46 { 47 cin>>n>>m; 48 int ans=0; 49 for(int i=0;i<=N;i++) f[i]=i; 50 51 for(int i=1;i<=m;i++) 52 { 53 scanf("%d%d",&a[i].f,&a[i].s); 54 if(a[i].f>a[i].s) swap(a[i].f,a[i].s); 55 a[i].f--; 56 v.push_back(a[i].f); 57 v.push_back(a[i].s); 58 59 cin>>str; 60 if(str[0]=='o') book[i]=1; 61 else book[i]=0; 62 } 63 sort(v.begin(),v.end()); 64 v.erase(unique(v.begin(),v.end()) , v.end()); 65 66 for(int i=1;i<=m;i++) 67 { 68 a[i].f= lower_bound(v.begin(),v.end(),a[i].f)-v.begin()+1; 69 a[i].s= lower_bound(v.begin(),v.end(),a[i].s)-v.begin()+1; 70 int f1=getf(a[i].f); 71 int f2=getf(a[i].s); 72 if(f1!=f2) 73 { 74 f[f1]=f2; 75 sum[f1]=sum[a[i].s]+book[i]-sum[a[i].f]; //sum[f1]=sum[a[i].s]^book[i]^sum[a[i].f] 76 ans++; 77 } 78 else 79 { 80 if( abs(sum[a[i].f]-sum[a[i].s]) %2 != book[i] ) break; //必定要abs。 81 else ans++; 82 } 83 } 84 cout<<ans<<endl; 85 86 }