H - Parity game-poj1733(需要离散化)
生活随笔
收集整理的這篇文章主要介紹了
H - Parity game-poj1733(需要离散化)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:給一個序列這個序列都是由0和1組成,現在隨意拿出來一個序列,然后說出他的和是奇數還是偶數,因為有可能存在假話,讓你判斷前多少條沒有假話,也就是查找第一個假話的位置-1
//這道題很像D題,都是線段區間,不過數據比較大,需要離散化一下。
#include<algorithm>
using?namespace?std;
const?int?maxn?=?100005;
int?f[maxn],?val[maxn];//val記錄區間奇偶值
int?p[maxn];//p數組保存需要離散化的數據
struct?node{int?u,?v,?sum;}a[maxn];//保存輸入
int?Find(int?x)
{
????int?k?=?f[x];
????if(f[x]?!=?x)
????{
????????f[x]?=?Find(f[x]);
????????val[x]?=?(val[x]+val[k])%2;
????}
????return?f[x];
}
int?main()
{
????int?N;
????while(scanf("%d",?&N)?!=?EOF)
????{
????????int?i,?M,?k=0;
????????char?s[10];
????????scanf("%d",?&M);
????????for(i=0;?i<M;?i++)
????????{
????????????scanf("%d%d%s",?&a[i].u,?&a[i].v,?s);
????????????a[i].sum?=?(s[0]?==?'e'???0?:?1);
????????????//為防止不在兩個不相鄰的數離散化后相鄰,在他們中間加一個數
????????????p[k++]?=?a[i].u,?p[k++]?=?a[i].u-1;
????????????p[k++]?=?a[i].v,?p[k++]?=?a[i].v-1;
????????}
????????p[k++]?=?N,?p[k++]?=?N-1;
????????sort(p,?p+k);
????????N?=?unique(p,?p+k)?-?p;//去重復函數
????????for(i=0;?i<N;?i++)
????????????f[i]?=?i,?val[i]?=?0;
????????for(i=0;?i<M;?i++)
????????{
????????????int?u?=?lower_bound(p,?p+N,?a[i].u-1)?-?p;//二分查詢
????????????int?v?=?lower_bound(p,?p+N,?a[i].v)?-?p;
????????????int?ru?=?Find(u),?rv?=?Find(v);
????????????if(ru?==?rv?&&?(val[u]+a[i].sum)%2?!=?val[v])
????????????????break;
????????????if(ru?<?rv)
????????????{
????????????????f[rv]?=?ru;
????????????????val[rv]?=?(val[u]+a[i].sum-val[v]+2)%2;
????????????}
????????????else?if(ru?>?rv)
????????????{
????????????????f[ru]?=?rv;
????????????????val[ru]?=?(val[v]-a[i].sum-val[u]+2)%2;//注意別寫錯val里面的參數
????????????}
????????}
????????printf("%d\n",?i);
????}
????return?0;
}
//這道題很像D題,都是線段區間,不過數據比較大,需要離散化一下。
?
?
#include?<stdio.h>#include<algorithm>
using?namespace?std;
const?int?maxn?=?100005;
int?f[maxn],?val[maxn];//val記錄區間奇偶值
int?p[maxn];//p數組保存需要離散化的數據
struct?node{int?u,?v,?sum;}a[maxn];//保存輸入
int?Find(int?x)
{
????int?k?=?f[x];
????if(f[x]?!=?x)
????{
????????f[x]?=?Find(f[x]);
????????val[x]?=?(val[x]+val[k])%2;
????}
????return?f[x];
}
int?main()
{
????int?N;
????while(scanf("%d",?&N)?!=?EOF)
????{
????????int?i,?M,?k=0;
????????char?s[10];
????????scanf("%d",?&M);
????????for(i=0;?i<M;?i++)
????????{
????????????scanf("%d%d%s",?&a[i].u,?&a[i].v,?s);
????????????a[i].sum?=?(s[0]?==?'e'???0?:?1);
????????????//為防止不在兩個不相鄰的數離散化后相鄰,在他們中間加一個數
????????????p[k++]?=?a[i].u,?p[k++]?=?a[i].u-1;
????????????p[k++]?=?a[i].v,?p[k++]?=?a[i].v-1;
????????}
????????p[k++]?=?N,?p[k++]?=?N-1;
????????sort(p,?p+k);
????????N?=?unique(p,?p+k)?-?p;//去重復函數
????????for(i=0;?i<N;?i++)
????????????f[i]?=?i,?val[i]?=?0;
????????for(i=0;?i<M;?i++)
????????{
????????????int?u?=?lower_bound(p,?p+N,?a[i].u-1)?-?p;//二分查詢
????????????int?v?=?lower_bound(p,?p+N,?a[i].v)?-?p;
????????????int?ru?=?Find(u),?rv?=?Find(v);
????????????if(ru?==?rv?&&?(val[u]+a[i].sum)%2?!=?val[v])
????????????????break;
????????????if(ru?<?rv)
????????????{
????????????????f[rv]?=?ru;
????????????????val[rv]?=?(val[u]+a[i].sum-val[v]+2)%2;
????????????}
????????????else?if(ru?>?rv)
????????????{
????????????????f[ru]?=?rv;
????????????????val[ru]?=?(val[v]-a[i].sum-val[u]+2)%2;//注意別寫錯val里面的參數
????????????}
????????}
????????printf("%d\n",?i);
????}
????return?0;
}
?
轉載于:https://www.cnblogs.com/liuxin13/p/4669500.html
總結
以上是生活随笔為你收集整理的H - Parity game-poj1733(需要离散化)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写字开头的成语有哪些?
- 下一篇: 求一个好听的魔族名字