锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
n鐨勮寖鍥存槸50000錛屼粠澶у埌灝忚繘琛屾灇涓撅紝濡傛灉鏄冭瘯鐨勪竴澶╄繘鍫嗭紝涓嶆槸鍒欐壘鍑烘渶澶х殑閭d釜澶嶄範鏃墮棿涓婇檺
姣旇緝闅懼鐞嗙殑鏄椂闂磋漿鍖栭棶棰橈紝鎴戝湪榪欓噷鏄妸瀹冩彁鍓嶄簡31銆?銆?600浣滀負涓涓搗濮嬫椂闂達紝鐒跺悗閮藉仛涓涓漿鎹?br>
絎竴涓▼搴忔垜鏄啓浜嗕竴涓猟ate鐨勭被錛岄噸杞戒簡鍚勭鎿嶄綔錛岀幇鍦ㄤ篃瑙夊緱鍦ㄨ繖縐嶆瘮璧涙彁閲岄潰濡傛灉娌℃湁蹇呰榪樻槸灝戜簺綾繪瘮杈冨ソ錛屽お澶嶆潅浜嗭紝璋冭瘯璧鋒潵涔熶笉娓呮櫚
浠ヤ笅鏄痑c浠g爜錛?br>
#include<algorithm>
#define maxn 50005
int T[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
using namespace std;
struct node
{
int test,bg,i;
friend bool operator<(node a,node b)
{
return a.test>b.test;
}
}in[maxn];
int n;
bool cmp2(int x,int y)
{
return in[x].bg<in[y].bg;
}
int leap(int y)
{
if((y%4==0&&y%100)||(y%400==0))return 1;
return 0;
}
int DtoI(int d,int m,int y)
{
int yy,mm,ret=0;
for(yy=1600;yy<y;yy++)
ret+=365+leap(yy);
for(mm=1;mm<m;mm++)
ret+=T[mm]+(int)(leap(y)&&mm==2);
ret+=d;
return ret;
}
void print(int x)
{
int yy,mm,dd;
for(yy=1600;x>=365+leap(yy);yy++)
{
x-=365+leap(yy);
if(!x)
{
printf("31.12.%04d\n",yy);
return;
}
}
for(mm=1;x>=T[mm]+(int)(leap(yy)&&mm==2);mm++)
{
x-=T[mm]+(int)(leap(yy)&&mm==2);
if(x==0)
{
printf("%02d.%02d.%04d\n",T[mm]+(int)(leap(yy)&&mm==2),mm,yy);
return;
}
}
printf("%02d.%02d.%04d\n",x,mm,yy);
}
int main()
{
//freopen("1","r",stdin);
scanf("%d",&n);
int i;
for(i=0;i<n;i++)
{
char str[12];
scanf("%s",str);
int d,m,y,t;
scanf("%d.%d.%d",&d,&m,&y);
scanf("%d",&t);
in[i].test=DtoI(d,m,y);
in[i].bg=in[i].test-t;
}
sort(in,in+n);
int maxd=in[0].test,index=-1;
int heap[maxn],heapsize=0;
bool yes=true;
int tmp=n;
for(;yes&&tmp;maxd--)
{
if(maxd==in[index+1].test)
{
heap[heapsize++]=index+1;
push_heap(heap,heap+heapsize,cmp2);
++index;
continue;
}
if(heapsize>0)
{
int top=heap[0];
pop_heap(heap,heap+heapsize,cmp2);
heapsize--;
if(in[top].bg>maxd)yes=false;
else tmp--;
}
}
if(!yes)
printf("Impossible\n");
else
{
print(maxd+1);
}
return 0;
}
]]>

榪樻槸絎竴嬈¤兘鍦ㄧ涓欏電殑鍛€傘傚懙鍛點傘傚皬瀹夋叞涓涓?br>
#include<iostream>
#include<algorithm>
#define MaxN 300005
#define MaxM 200005
using namespace std;
int N,M,res[MaxM];
struct node
{
int pri,n;
friend bool operator<(node a,node b)
{
return a.pri<b.pri;
}
}index[MaxN],ii[MaxN];
struct line
{
int b,e,k,n,ans;
friend bool operator<(line a,line b)
{
return a.b<b.b;
}
}Line[MaxM];
int cc[MaxN];
void inser_del(int key,int flag)
{
int L=0,R=N-1,mid,v=1;
while(L<R)
{
cc[v]+=flag;
mid=(L+R)/2;
v*=2;
if(key<=mid)
R=mid;
else
{
v++;
L=mid+1;
}
}
cc[v]+=flag;
}
int solve(int k)
{
int L=0,R=N-1,mid,v=1;
while(L<R)
{
mid=(L+R)/2;
if(cc[2*v]>=k)
{
R=mid;
v*=2;
}
else
{
L=mid+1;
k-=cc[2*v];
v=2*v+1;
}
}
return index[L].pri;
}
int main()
{
int i,j;
scanf("%d%d",&N,&M);
for(i=0;i<N;index[i].n=i++)
scanf("%d",&index[i].pri);
for(i=0;i<M;Line[i].n=i++)
{
scanf("%d%d%d",&Line[i].b,&Line[i].e,&Line[i].k);
if(Line[i].b>Line[i].e)swap(Line[i].b,Line[i].e);
--Line[i].b;
--Line[i].e;
}
//鍒濆鍖?/span>-->cc涓?
sort(index,index+N);
sort(Line,Line+M);
for(i=0;i<N;i++)
{
ii[index[i].n].pri=index[i].pri;
ii[index[i].n].n=i;
}
for(i=Line[0].b;i<=Line[0].e;i++)
inser_del(ii[i].n,1);
for(i=1;i<M;i++)
{
Line[i-1].ans=solve(Line[i-1].k);
if(Line[i - 1 ].e>=Line[i].b)
{for (j = Line[i - 1 ].b; j < Line[i].b; j ++ )
inser_del(ii[j].n,-1);
for (j = Line[i - 1 ].e + 1 ; j <= Line[i].e; j ++ )
inser_del(ii[j].n,1);
}
else
{
for(j=Line[i - 1].b;j<=Line[i - 1 ].e;j ++ )
inser_del(ii[j].n,-1);
for (j = Line[i].b; j <= Line[i].e; j ++ )
inser_del(ii[j].n,1);
}
}
Line[i-1].ans=solve(Line[i-1].k);
for(i=0;i<M;i++)
res[Line[i].n]=Line[i].ans;
for(i=0;i<M;i++)
printf("%d\n",res[i]);
return 0;
}

]]>
濡傛灉瑕佸姩鎬佹洿鏂癿嬈°傘傛垜浠樉鐒跺彲浠ョ敤o(mn)鐨勬毚鍔涘紕鍑烘潵
鍏跺疄鍙互o(mlogn)鐨勶紱
鍦ㄦ潕鐫跨殑璁烘枃閲屾彁鍑轟簡涓縐嶆柊鐨勬暟鎹粨鏋勶細
寰堝閥濡欙紝寰堝己澶э細
瀵逛簬搴忓垪a[]錛屾垜浠涓涓暟緇凜錛屽叾涓?v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
c[i]=a[i]+a[i-1]+...+
a[i-2^k+1]//榪欎竴欏圭殑鏈鍚庝竴浣嶄竴瀹氭槸0
鍖呭惈a[x]鐨刢搴忓垪錛?/span>
c[x]=a[x]+a[x-1]+...+a[x-2^k+1]
c[x+2^k]=a[x+2^k]+a[x+2^k-1]...+a[x]+...+a[x-2^k+1]
....
涓鐩村姞鍒?lt;=S鐨勭姸鍐?/span>
閽堝榪欎釜鎯呭喌銆傘傛垜浠湁涓や釜瀹炵幇銆傘備竴涓槸update(),鍙︿竴涓槸緇熻鐨勬搷浣?br>濡傛灉閽堝涓婇潰鐨勭粺璁″氨鏄眰緇欏畾鍖洪棿鐨剆um 錛坸,y錛?sum(1,y)-sum(1,x)錛?br>
procedure UPDATA(x,A)
begin
p←x
while (p<=n) do
begin
C[p]←C[p]+A
p←p+LOWBIT(p)
end
end 
姹俛[1]-a[x]鐨勫拰
function SUM(x)
begin
ans ← 0
p ← x
while (p>0) do
begin
ans←ans+C[p]
p←p-LOWBIT(p)
end
return ans
end 

#include<iostream>
#define MaxS 1025
#define L(a) (a&(a^(a-1)))
int S,x,y,A,L,B,R,T;
int c[MaxS][MaxS];
void update()
{
//x<=i<S鐨刢[i][y]鏇存柊
int i,j;
for(i=x;i<=S;i+=L(i))
for(j=y;j<=S;j+=L(j))
c[i][j]+=A;
}
int compute(int x,int y)
{
int result=0,i,j;
for(i=x;i>0;i-=L(i))
for(j=y;j>0;j-=L(j))
result+=c[i][j];
return result;
}
int main()
{
int oper,ans;
while(scanf("%d",&oper)&&oper!=3)
{
switch (oper)
{
case 0:
scanf("%d",&S);
memset(c,0,sizeof(c));
break;
case 1:
scanf("%d%d%d",&x,&y,&A);
x++,y++;
update();
break;
case 2:
scanf("%d%d%d%d",&L,&B,&R,&T);
L++,B++,R++,T++;
ans=compute(R,T)-compute(L-1,T)-compute(R,B-1)+compute(L-1,B-1);
printf("%d\n",ans);
break;
}
}
return 0;
}
#include<iostream>
#include<algorithm>
#define MaxN 26
const char stdt='a';
using namespace std;
struct trie
{
trie* next[MaxN];
int val;
trie()
{
int i;
for(i=0;i<MaxN;i++)next[i]=0;
val=0;
}
~trie()
{
int i;
for(i=0;i<MaxN;i++)delete(next[i]);
}
};
int main()
{
char words[12],*t;
int ans;
trie* root=new trie,*p;
while(gets(words)&&strcmp(words,"")){
p=root;
t=words;
while(*t){
if(p->next[*t-stdt]==0)
p->next[*t-stdt]=new trie;
p=p->next[*t-stdt];
(p->val)++;
t++;
}
}
while(scanf("%s",words)!=EOF){
p=root;
t=words;
while(*t){
if(p->next[*t-stdt]==0){
ans=0; break;}
p=p->next[*t-stdt];
ans=p->val;
t++;
}
printf("%d\n",ans);
}
return 0;
}
#include<iostream>
#include<cstring>
#define keyNum 26
#define MaxN 500005
struct node{
int parent;
int rank;
int num;//榪欎釜棰滆壊鍑虹幇鐨勬鏁?br>
node()
{
num=rank=0;
parent=-1;
}
};
node colour[MaxN];
int id=0;//鏁扮粍鏍囪
struct trie{
struct trieNode{//trie緇撶偣鐨勭粨鏋?br>
trieNode *link[keyNum];//涓嬫爣涓?nbsp;'a' , 'b' , 'c' , , 'z' 鐨勬寚閽堟暟緇?/span>
int num[keyNum];//鎻掑叆榪欎釜鍗曡瘝鍦ㄦ暟緇勪腑鐨勪綅緗?br>
trieNode(){
memset(num,-1,sizeof(num));//-1琛ㄧず榪樻湭鎻掑叆鏁扮粍
memset(link,NULL,sizeof(link));
}
void init(){
memset(link,NULL,sizeof(link));
memset(num,-1,sizeof(num));
}
};
trieNode* root;
trie()
{
root=(trieNode*)malloc(sizeof(trieNode));//鍒濆鍖栨椂涓簉oot鐢寵浜嗙┖闂?br>
root->init();
}
int Insert(char []);//榪斿洖鏁扮粍涓殑浣嶇疆
void Delete(trieNode*);//閲婃斁絀洪棿
};
void trie::Delete(trieNode* t)
{
int i;
for(i=0;i<keyNum;i++)
if(t->link[i])Delete(t->link[i]);
memset(t->num,0,sizeof(t->num));
delete(t);
}
int trie::Insert(char x[])
{
trieNode *current=root;
int i=1;
while(x[i]){
if(current->link[x[i-1]-'a']==NULL){
current->link[x[i-1]-'a']=(trieNode*)malloc(sizeof(trieNode));
(current->link[x[i-1]-'a'])->init();
}
current=current->link[x[i-1]-'a'];
i++;
}
if(current->num[x[i-1]-'a']==-1)
current->num[x[i-1]-'a']=id++;
colour[current->num[x[i-1]-'a']].num++;//鍑虹幇鐨勬鏁?+
return current->num[x[i-1]-'a'];
}
void init()
{
int i;
for(i=0;i<MaxN;i++)
colour[i].parent=i;
}
void union_set(int x,int y)
{
if(colour[x].rank>colour[y].rank)
colour[y].parent=x;
else {
colour[x].parent=y;
if(colour[x].rank==colour[y].rank)
colour[y].rank++;
}
}
int find_set(int x)
{
if(x!=colour[x].parent)
colour[x].parent=find_set(colour[x].parent);
return colour[x].parent;
}
bool comman_father()
{
int i,p=0;
p=find_set(0);
for(i=1;i<id;i++)
if(find_set(i)!=p)return false;
return true;
}
void solve()
{
if(comman_father()==false){
printf("Impossible\n");
return;
}
int i,head_end=0;
for(i=0;i<id;i++)
if(colour[i].num%2==1)//鍒ゆ柇澶村拰灝?br>
head_end++;
if(head_end==2||!head_end)//涓涓病鍥炶礬錛屼竴涓槸鏈夊洖璺?br>
printf("Possible\n");
else printf("Impossible\n");
}
int main()
{
char colr1[12],colr2[12];
trie a;
int ncolr1,ncolr2;
init();
while(scanf("%s%s",colr1,colr2)!=EOF){
ncolr1=a.Insert(colr1);
ncolr2=a.Insert(colr2);
union_set(find_set(ncolr1),find_set(ncolr2));
}
//涓嬮潰鍒ゆ柇鏈夊嚑涓猵arent錛岃嫢鏈夊涓け璐?br>
solve();
a.Delete(a.root);
return 0
}

#include<iostream>
#define keyNum 26
#define MaxN 50
struct trie{
struct trieNode{//trie緇撶偣鐨勭粨鏋?br>
trieNode *link[keyNum];//涓嬫爣涓?nbsp;'A' , 'B' , 'C' ,
, 'Z' 鐨勬寚閽堟暟緇?/span>
int num[keyNum];//鎻掑叆key鐨勬鏁?br>
trieNode(){
memset(num,0,sizeof(num));
memset(link,NULL,sizeof(link));
}
void init(){
memset(link,NULL,sizeof(link));
memset(num,0,sizeof(num));
}
};
trieNode* root;
trie()
{
root=(trieNode*)malloc(sizeof(trieNode));//鍒濆鍖栨椂涓簉oot鐢寵浜嗙┖闂?br>
root->init();
}
bool Search(char *);
void Insert(char []);
void Delete(trieNode*);
};
bool trie::Search(char * x)
{
if(*x==0)return false;
trieNode* current=root;
x++;
while(*x){
if(current->link[*(x-1)-'a'])
current=current->link[*(x-1)-'a'];
else break;
x++;
}
if(*x==0&¤t->num[*(x-1)-'a'])
return true;
else return false;
}
void trie::Delete(trieNode* t)
{
int i;
for(i=0;i<keyNum;i++)
if(t->link[i])Delete(t->link[i]);
memset(t->num,0,sizeof(t->num));
delete(t);
}
void trie::Insert(char x[])
{
trieNode *current=root;
int i=1;
while(x[i]){
if(current->link[x[i-1]-'a']==NULL){
current->link[x[i-1]-'a']=(trieNode*)malloc(sizeof(trieNode));
(current->link[x[i-1]-'a'])->init();
}
current=current->link[x[i-1]-'a'];
i++;
}
(current->num[x[i-1]-'a'])++;
}
char c[ 50000 ][MaxN],tmp;
int main()
{
trie a;
int i=0,j,num;
while(scanf("%s",c[i])!=EOF)
a.Insert(c[i++]);
num=i;
for(i=0;i<num;i++)
for(j=1;c[i][j];j++){
tmp=c[i][j];
c[i][j]=0;
if(a.Search(c[i])){
c[i][j]=tmp;
if(a.Search(&c[i][j])){
printf("%s\n",c[i]);
break;}
}
else c[i][j]=tmp;
}
a.Delete(a.root);
return 0;
}
#include<iostream>
#define MaxN 50000
typedef struct {
int parent;
int rank;
int food;//鎸囧悜椋熺墿綾?br> 7
int enemy;//鎸囧悜澶╂晫綾?br> 8
}NODE;
NODE animal[MaxN+1];
void init(int n)
{
int i;
for(i=1;i<=n;i++){
animal[i].parent=i;
animal[i].rank=0;
animal[i].food=-1;
animal[i].enemy=-1;
}
}
int find_set(int x)
{
if(x==-1)return -1;//鏈変簺food錛宔nemy鎸囧悜-1
if(animal[x].parent!=x)
animal[x].parent=find_set(animal[x].parent);
return animal[x].parent;
}
int union_set(int x,int y)
{
if(x==-1)return y;
if(y==-1)return x;
if(animal[x].rank>animal[y].rank){
animal[y].parent=x;
return x;}
else {
animal[x].parent=y;
if(animal[x].rank==animal[y].rank)animal[y].rank++;
return y;}
}
void make(int x,int y,int fx,int fy,int ex,int ey)//鍒涘緩x鍚儁鐨勫叧緋?br>40
{
int t,v,w;
t=union_set(fx,y);//棣栧厛灝唝涓巟鐨刦ood鍚堝茍
v=union_set(x,ey);
w=union_set(ex,fy);
animal[v].enemy=w;
animal[v].food=t;
animal[t].enemy=v;
animal[t].food=w;
if(w!=-1){
animal[w].food=v;
animal[w].enemy=t;}
}
int main()
{
int N,K,i,wn=0,x,y,fx,fy,ex,ey,oper;
int t,u,v;
scanf("%d%d",&N,&K);
init(N);
for(i=1;i<=K;i++){
scanf("%d%d%d",&oper,&x,&y);//oper涓?鐨勬椂鍊欒〃紺簒鍜寉鏄悓綾伙紝oper涓?鐨勬椂鍊欒〃紺簒鍚儁
if(x>N||y>N){wn++;continue;}
x=find_set(x);
y=find_set(y);
fx=find_set(animal[x].food);//fx鍙兘鏄?/span>-1
fy=find_set(animal[y].food);//fy涔熷彲鑳芥槸-1
ex=find_set(animal[x].enemy);
ey=find_set(animal[y].enemy);
if(x==y){if(oper==2)wn++;continue;}//1.x,y鍚岀被
if(fy==x){wn++;continue;}//3.y鍚儀
if(fx==y){if(oper==1)wn++;continue;}//2.x鍚儁
if(oper==2)make(x,y,fx,fy,ex,ey);//4..x鍜寉灝氭湭浜х敓鑱旂郴,鍒涘緩鑱旂郴錛岄鍏堟槸x鍚儁錛屽叾嬈鐨刦ood綾誨悆x
if(oper==1){//4..x鍜寉灝氭湭浜х敓鑱旂郴,鍒涘緩鑱旂郴
t=union_set(x,y);
u=union_set(fx,fy);
v=union_set(ex,ey);
animal[t].food=u;
animal[t].enemy=v;
if(u!=-1){
animal[u].enemy=t;
animal[u].food=v;}
if(v!=-1){
animal[v].food=t;
animal[v].enemy=u;}}
}
printf("%d\n",wn);
return 0;
}