现在的位置: 首页 > 综合 > 正文

HDU 2419 Boring Game

2013年10月12日 ⁄ 综合 ⁄ 共 2736字 ⁄ 字号 评论关闭

十分悲剧,无线蛋疼,昨天纠结一天! 就因为modify(que[i].v1,ri[que[i].v1][cnt[que[i].v1]],ri[que[i].v1][cnt[que[i].v1]-1])+(--cnt[que[i].v1])用modify(que[i].v1,ri[que[i].v1][cnt[que[i].v1]],ri[que[i].v1][-- cnt[que[i].v1]])代替,估计是调用函数的执行顺序有关系;情何以堪!

#include<iostream>
#include<algorithm>
#include<stack>
#include<map>
#include<set>
#include<vector>
using namespace std;
struct PP
{
int first,second;
PP(int a,int b){first=a;second=b;}
bool operator < (const PP & b) const
{
if(first==b.first)
return second<b.second;
else return first<b.first;
}
};
struct fuck
{
char ch;
int v1,v2;
};
set<PP> node[20000+5];
fuck que[300000+10];
int father[20000+5];
multiset <pair<int,int> > e;
int n,m,Q;
vector<int> ri[20000+5];
int cnt[20000+5];
int cha(int a)
{
// return (a==father[a]?a:cha(father[a]));
if(a!=father[a]) 
{
father[a]=cha(father[a]);
}
return father[a];
}
void unionset(int a,int b)
{
int fa=cha(a);
int fb=cha(b);
if(fa == fb) return ;
set<PP>::iterator it;
if(node[fa].size()<node[fb].size()){
father[fa]=fb;
for(it=node[fa].begin();it!=node[fa].end();it ++)
node[fb].insert(*it);
}
else{
father[fb]=fa;
for(it=node[fb].begin();it!=node[fb].end();it ++)
node[fa].insert(*it);
}
}
void modify(int a,int pb,int b)
{
int fa=cha(a);
node[fa].erase(PP(pb,a));
node[fa].insert(PP(b,a));
}
int main()
{
int i,j;
int ea,eb,val,cas=0;
char ca[8];
while(scanf("%d%d%d",&n,&m,&Q)!=EOF)
e.clear();
memset(cnt,0,sizeof(cnt));
for(i=1;i<=n;i++)
{
scanf("%d",&val);
node[i].clear();
// node[i].insert(PP(val,i));
ri[i].clear();
ri[i].push_back(val);
father[i]=i;
}
for(i=1;i<=m;i++){
scanf("%d %d",&ea,&eb);
if(ea>eb) swap(ea,eb);
//unionset(ea,eb);
e.insert(make_pair(ea,eb));
}
for(i=1;i<=Q;i++)
{
scanf("%s %d %d",ca,&que[i].v1,&que[i].v2);
que[i].ch=ca[0];
//sta.push(now);
if(que[i].ch=='E')
{
if(que[i].v1>que[i].v2) swap(que[i].v1,que[i].v2);
multiset <pair<int,int> >::iterator mit;
mit=e.find(make_pair(que[i].v1,que[i].v2));
e.erase(mit);
}
else if(que[i].ch=='U')
{
ri[que[i].v1].push_back(que[i].v2);
cnt[que[i].v1]++;
}
}
for(i=1;i<=n;i++) node[i].insert(PP(ri[i][cnt[i]],i));
multiset <pair<int,int> >::iterator mit;
for(mit=e.begin();mit!=e.end();mit ++)
{
unionset(mit->first,mit->second);
}
__int64 sum=0,c=0;
for(i=Q;i>=1;i--)
{
//now=sta.top();
//sta.pop();
if(que[i].ch=='E')
unionset(que[i].v1,que[i].v2);
else if(que[i].ch=='U')
{
//int fa=cha(que[i].v1);
// node[fa].erase(PP(ri[que[i].v1][cnt[que[i].v1]],que[i].v1));
//node[fa].insert(PP(ri[que[i].v1][--cnt[que[i].v1] ],que[i].v1));
//int pb=ri[que[i].v1][cnt[que[i].v1]];
//int b=ri[que[i].v1][--cnt[que[i].v1] ];
//modify(que[i].v1,pb,b);
modify(que[i].v1,ri[que[i].v1][cnt[que[i].v1]],ri[que[i].v1][cnt[que[i].v1]-1]);
cnt[que[i].v1] --;
}
else 
{
c ++;
int fa=cha(que[i].v1);
set<PP>::iterator it=node[fa].lower_bound(PP(que[i].v2,0));
if(it!=node[fa].end())
sum+=(*it).first;
}
}
double ans;
if(cnt==0)
printf("Case %d: 0.000/n",++cas);
else{
ans=(sum*1.0)/(c*1.0);
printf("Case %d: %.3f/n",++cas,ans);
}
}
return 0;
}

 

抱歉!评论已关闭.