[破碎的状态] [-8] 倒数第二场cf(Before NOI)
这一场比赛的经历也是比较有趣呢
00:00:00 Participant has been assigned to the room (assigned to) 7
00:09:21 B Accepted [main tests]
00:16:37 A Accepted [main tests]
00:27:48 C Pretests passed [pretests]
01:30:44 E Wrong answer on pretest 5 [pretests]
01:36:07 E Wrong answer on pretest 5 [pretests]
01:42:57 E Accepted [main tests]
01:43:49 A has been locked
01:45:46 A Unsuccessful hacking attempt of TooDifficuIt
02:09:46 C Hacked by dnvtmf
02:10:41 C Accepted [main tests]
02:11:01 C has been locked
02:12:44 C Successful hacking attempt of Na2a
经历:
B是个水题啊..看到题面短就把它拆了
A是个水题啊..看完题就把它拆了
C是个找规律题啊..
看着0/1 1/2 1/4 3/8 5/16 11/32 21/64
感觉右边是2^(n-1)
左边是2^(n-1)+1或-1 /3
...交了,过pretest
D..不会做
E..树链剖分..
超级麻烦的样子哦...写了350行..
然后..A看别人写%lld就hack上去了
Unsuccessful..不开心
比赛快结束的时候,C被hack了....
1分钟修改正确,2分钟后hack了另一个人..补分
但没超过Q..被虐了几分
第一次把div 1做的这么好!
涨Rating啦!可惜没冲上2200
纪念下人生中第一个AC的div 1 E
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
vector<int> v[100005];
vector<int> ans[100005];
struct edge
{
int y;
edge * next;
};
edge * new_edge()
{
static edge a[200005];
static int top=0;
return &a[top++];
}
edge * li[100005];
void inserts(int x,int y)
{
edge * t=new_edge();
t->y=y;
t->next=li[x];
li[x]=t;
}
void insert_edge(int x,int y)
{
inserts(x,y);
inserts(y,x);
}
int depth[100005];
int father[100005];
edge * prefer_edge[100005];
int dfn[100005];
int size[100005];
void dfs1(int x)
{
edge * t;
size[x]=1;
int max_size=0;
for (t=li[x];t!=0;t=t->next)
{
if (t->y==father[x])
{
continue;
}
depth[t->y]=depth[x]+1;
father[t->y]=x;
dfs1(t->y);
size[x]+=size[t->y];
if (size[t->y]>max_size)
{
max_size=size[t->y];
prefer_edge[x]=t;
}
}
}
int vis[100005];
int up[100005];
void dfs2(int x)
{
static int num=0;
dfn[x]=num;
vis[num]=x;
num++;
if (prefer_edge[x]==0) return;
up[prefer_edge[x]->y]=up[x];
dfs2(prefer_edge[x]->y);
edge * t;
for (t=li[x];t!=0;t=t->next)
{
if (t->y==father[x])
{
continue;
}
if (t==prefer_edge[x])
{
continue;
}
up[t->y]=t->y;
dfs2(t->y);
}
}
long long val[1<<20];
int val2[1<<20];
long long tag[1<<20];
void push_up(int num)
{
if (val2[num*2+1]==-1)
{
val[num]=val[num*2+2];
val2[num]=val2[num*2+2];
}
else if (val2[num*2+2]==-1)
{
val[num]=val[num*2+1];
val2[num]=val2[num*2+1];
}
else if (val[num*2+1]<val[num*2+2])
{
val[num]=val[num*2+1];
val2[num]=val2[num*2+1];
}
else if (val[num*2+2]<val[num*2+1])
{
val[num]=val[num*2+2];
val2[num]=val2[num*2+2];
}
else if (val2[num*2+1]<val[num*2+2])
{
val[num]=val[num*2+1];
val2[num]=val2[num*2+1];
}
else
{
val[num]=val[num*2+2];
val2[num]=val2[num*2+2];
}
}
void push_down(int num)
{
if (tag[num]==0) return;
val[num*2+1]+=tag[num];
tag[num*2+1]+=tag[num];
val[num*2+2]+=tag[num];
tag[num*2+2]+=tag[num];
tag[num]=0;
}
void change(int num,int l,int r,int l0,int r0,int k)
{
if ((l0<=l)&&(r<=r0))
{
tag[num]+=k;
val[num]+=k;
return;
}
int mid=(l+r)/2;
push_down(num);
if (l0<mid) change(num*2+1,l,mid,l0,r0,k);
if (mid<r0) change(num*2+2,mid,r,l0,r0,k);
push_up(num);
}
void build_tree(int num,int l,int r)
{
if (l==r-1)
{
tag[num]=0;
if (v[vis[l]].size()==0)
{
val2[num]=-1;
return;
}
val2[num]=v[vis[l]][v[vis[l]].size()-1];
val[num]=val2[num];
return;
}
int mid=(l+r)/2;
build_tree(num*2+1,l,mid);
build_tree(num*2+2,mid,r);
push_up(num);
}
void change2(int num,int l,int r,int t)
{
if (l==r-1)
{
if (v[vis[l]].size()==0)
{
val2[num]=-1;
return;
}
v[vis[l]].pop_back();
if (v[vis[l]].size()==0)
{
val2[num]=-1;
return;
}
val[num]-=val2[num];
val2[num]=v[vis[l]][v[vis[l]].size()-1];
val[num]+=val2[num];
return;
}
int mid=(l+r)/2;
push_down(num);
if (t<mid)
{
change2(num*2+1,l,mid,t);
}
else
{
change2(num*2+2,mid,r,t);
}
push_up(num);
}
long long ans1;
int ans2;
void update_ans(int num)
{
if (ans2==-1)
{
ans1=val[num];
ans2=val2[num];
}
else if (val2[num]==-1)
{
return;
}
else if (val[num]<ans1)
{
ans1=val[num];
ans2=val2[num];
}
else if (ans1<val[num])
{
return;
}
else if (val2[num]<ans2)
{
ans1=val[num];
ans2=val2[num];
}
}
void query(int num,int l,int r,int l0,int r0)
{
if ((l0<=l)&&(r<=r0))
{
update_ans(num);
return;
}
int mid=(l+r)/2;
push_down(num);
if (l0<mid) query(num*2+1,l,mid,l0,r0);
if (mid<r0) query(num*2+2,mid,r,l0,r0);
}
int n;
int querys(int x,int y)
{
ans2=-1;
for (;;)
{
if (up[x]==up[y])
{
if (depth[x]<depth[y]) swap(x,y);
query(0,0,n,dfn[y],dfn[x]+1);
return ans2;
}
else
{
if (depth[up[x]]<depth[up[y]]) swap(x,y);
query(0,0,n,dfn[up[x]],dfn[x]+1);
x=father[up[x]];
}
}
}
int a[100005];
int main()
{
#ifdef absi2011
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
int m,q;
scanf("%d%d%d",&n,&m,&q);
int i;
for (i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x--;
y--;
insert_edge(x,y);
}
for (i=0;i<m;i++)
{
int x;
scanf("%d",&x);
x--;
a[i]=x;
}
for (i=m-1;i>=0;i--)
{
v[a[i]].push_back(i);
}
depth[0]=0;
dfs1(0);
up[0]=0;
dfs2(0);
int tot=0;
build_tree(0,0,n);
for (i=0;i<q;i++)
{
int x,y;
int oper;
scanf("%d",&oper);
if (oper==1)
{
scanf("%d%d",&x,&y);
x--;
y--;
int k;
scanf("%d",&k);
for (;;)
{
int t=querys(x,y);
if (t!=-1)
{
change2(0,0,n,dfn[a[t]]);
ans[tot].push_back(t);
}
else
{
break;
}
k--;
if (k==0) break;
}
tot++;
}
else
{
int x;
scanf("%d",&x);
x--;
int k;
scanf("%d",&k);
change(0,0,n,dfn[x],dfn[x]+size[x],k);
}
}
for (i=0;i<tot;i++)
{
printf("%d",(int)ans[i].size());
int j;
for (j=0;j<(int)ans[i].size();j++)
{
printf(" %d",ans[i][j]+1);
}
printf("\n");
}
return 0;
}
Jul 15, 2016 01:46:40 PM
%cha杜教爷
Jul 15, 2016 07:06:46 PM
又不是Sucessful你%个毛线啊
Jul 15, 2016 07:40:29 PM
Sucessful是什么意思呀
Jul 15, 2016 09:33:43 PM
@JCarlson 跟他谈谈我的英语水平...........
Jul 15, 2016 09:41:50 PM
%英语爷&&cha杜教爷
Jul 15, 2016 10:00:46 PM
妈呀JClrason也来D我了...............