这里会显示出您选择的修订版和当前版本之间的差别。
2020-2021:teams:wangzai_milk:f._perils_in_parallel [2020/05/17 21:10] zars19 创建 |
2020-2021:teams:wangzai_milk:f._perils_in_parallel [2020/05/18 11:19] (当前版本) zars19 |
||
---|---|---|---|
行 1: | 行 1: | ||
<code cpp> | <code cpp> | ||
+ | #include<cstdio> | ||
+ | #include<cstring> | ||
+ | #include<iostream> | ||
+ | #include<algorithm> | ||
+ | #include<vector> | ||
+ | using namespace std; | ||
+ | const int N=1e5+5,M=2e5+5; | ||
+ | int n,m; | ||
+ | int read() | ||
+ | { | ||
+ | int x=0,f=1;char c=getchar(); | ||
+ | while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} | ||
+ | while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} | ||
+ | return x*f; | ||
+ | } | ||
+ | struct Node1{int a,b;}bomb[N]; | ||
+ | struct Node2{int l,r,id;}cord[M]; | ||
+ | struct Node3{int nxt,to,id;}Edges[M*2]; | ||
+ | int num[N],cnt=0,w[N],head[N],tot=0; | ||
+ | bool vis[N],legal=true; | ||
+ | vector<int>c; | ||
+ | int getw(int x){return lower_bound(num+1,num+1+cnt,x)-num;} | ||
+ | void addedge(int u,int v,int id) | ||
+ | { | ||
+ | Edges[++tot].nxt=head[u]; | ||
+ | head[u]=tot; | ||
+ | Edges[tot].id=id,Edges[tot].to=v; | ||
+ | } | ||
+ | void dfs(int u,int f,int fEdge) | ||
+ | { | ||
+ | vis[u]=1; | ||
+ | for(int i=head[u];~i;i=Edges[i].nxt) | ||
+ | { | ||
+ | int v=Edges[i].to; | ||
+ | if(!vis[v])dfs(v,u,Edges[i].id); | ||
+ | } | ||
+ | if(w[u]==1) | ||
+ | { | ||
+ | if(!f){legal=0;return;} | ||
+ | w[u]^=1,w[f]^=1,c.push_back(fEdge); | ||
+ | } | ||
+ | } | ||
+ | int main() | ||
+ | { | ||
+ | memset(head,-1,sizeof(head)); | ||
+ | n=read(),m=read(); | ||
+ | for(int i=1;i<=n;i++) | ||
+ | { | ||
+ | bomb[i].a=read(),bomb[i].b=read(); | ||
+ | num[++cnt]=bomb[i].a; | ||
+ | } | ||
+ | sort(num+1,num+1+cnt); | ||
+ | cnt=unique(num+1,num+1+cnt)-num-1; | ||
+ | for(int i=1;i<=n;i++)w[getw(bomb[i].a)]=bomb[i].b; | ||
+ | for(int i=cnt+1;i;i--)w[i]^=w[i-1]; | ||
+ | for(int i=1;i<=m;i++) | ||
+ | { | ||
+ | cord[i].l=read(),cord[i].r=read(),cord[i].id=i; | ||
+ | int x=getw(cord[i].l),y=getw(cord[i].r+1); | ||
+ | addedge(x,y,i),addedge(y,x,i); | ||
+ | } | ||
+ | for(int i=1;i<=cnt+1;i++) | ||
+ | { | ||
+ | if(!vis[i])dfs(i,0,0); | ||
+ | if(!legal)break; | ||
+ | } | ||
+ | if(!legal)puts("-1"); | ||
+ | else | ||
+ | { | ||
+ | printf("%d\n",c.size()); | ||
+ | sort(c.begin(),c.end()); | ||
+ | for(int i=0;i<c.size();i++)printf("%d ",c[i]); | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
</code> | </code> |