計蒜客 2019 ICPC 南昌邀請賽

2021-09-25 12:49:15 字數 2730 閱讀 8786

目錄

f.sequence(線段樹 單點更新+區間查詢)

g.winner(思維)

j.prefix(字典樹)

k.a good game(樹狀陣列+貪心)

題意:

定義給定

操作1:格式為0 x y,把ax改為y

操作2:格式為1 x y,求f(x,y)

分析:

不難發現,f(l,r)可由以下項異或得到:

1*(r-l+1)個

2*(r-l)個

3*(r-l-1)個

······

(r-l+1)*1個

顯然,、

分情況討論:

情況1:r-l+1為奇數,則

情況2:r-l+1為偶數,則答案為0

思路:建2棵線段樹,第一棵tr1只含有a陣列的奇數項,偶數項全為0,另一顆tr2只含有a陣列的偶數項,奇數項全為0。

那麼r-l+1為奇數時:若l為奇數,用tr1線段樹求f(l,r);若l為偶數,用tr2線段樹求f(l,r)。

r-l+1為偶數時:答案為0

單點更新時只需把更新後的值和原值異或得到的值傳入update函式進行更新即可。

**:

#include#include#include#include#include#include#includeusing namespace std;

const int maxn=1e5+5;

typedef long long ll;

int a[maxn],t1[maxn],t2[maxn],ans;

struct nodetr1[maxn<<2],tr2[maxn<<2];

void build(node *tr,int *arr,int rt,int l,int r)else

}void update(node *tr,int rt,int ql,int qr,int val)

int mid=(tr[rt].l+tr[rt].r)>>1;

if(qr<=mid)

update(tr,rt<<1,ql,qr,val);

else if(mid>1;

if(qr<=mid)

query(tr,rt<<1,ql,qr);

else if(mid題意:

n個人,每個人在不同模式下有不同的能力值,共有三種模式。任選模式任選未被淘汰的人進行n-1場比賽(該模式下能力值高的人獲勝),最後乙個人獲勝。問:給定第k個人,他有沒有可能贏?

思路:假定第i個人有可能贏,那麼你只要在某一模式下能贏他,那麼你就能贏。因為你能贏第i個人,然後他幫你贏其他所有人。

首先輸入的同時記錄該模式下能力值最大的那個人的id,這個人有可能贏。然後記錄能贏的人他們的不同模式下能力值的最小值。(即你只需要在某一模式下大於這個最小能力值,你也能贏)

每次從頭遍歷,如果找到乙個還不知道能不能贏的人,他在某一模式下比能贏的所有人在該模式下能力值的最小值還大,那麼這個人也能贏,如果找不到,結束迴圈,剩下所有還不知道能不能贏的人都是不可能贏的。

隊友敲的**:

#include#includeint a[4][100010];

bool vis[100010];

int vnum[4]=;

void changemin(int j)

}vis[id[i]]=true;

}//for(int i=1;i<=3;i++)printf("%d ",id[i]);

//printf("\n");

for(int i=1;i<=3;i++)

//printf("\n");

}int modi=1;

//for(int i=1;i<=3;i++)printf("%d\n",vnum[i]);

while(modi)}}

if(flag==0) modi=0;

}int p;

for(int i=1;i<=m;i++)

}

分析:

隊友說是字典樹模板題,emmm,然而弱雞的我並不會字典樹······

隊友敲的**:

#include#include#include#include#include#include#includeusing namespace std;

const int maxn=1e5+5;

typedef long long ll;

string s[maxn];

int trie[10*maxn][26],tot=1;

ll d[26],d[maxn],n,m;

struct node;

}node[maxn*10];

void insert(int id)

return ans;

}int main()

for(int i=1;i<=n;++i)

return s;

}void add(int i,int x)

}ll s[maxn+1],ans;

int main()

for(int i=1;i<=m;i++)

sort(s+1,s+m+1);

ans=0;

for(int i=m;i>0;i--)

printf("%lld\n",ans);

} return 0;

}

2019ICPC南昌邀請賽A題

當時隊友都在做其他的題,我就去看了一下。先交幾發最小生成樹wa下,然後就走了 打完比賽dalao們說是斯坦納樹板板。行吧 打完比賽太多了,直到現在才有時間,計蒜客也出復現賽了,就去學了一下 先說一下a題題意 先給n個點,點的名字還是英文的,還要記錄一下,然後給出m條邊。之後給出4行,每行兩個點的名字...

計蒜客 2019 南昌邀請賽 B題

題解 拉格朗日插值裸題 2019 icpc南昌區域賽 b題 includeusing namespace std typedef long long ll mod一定要是質數 const int mod 9999991 int pv 2000 前幾項,前面無效值用0佔位 int st 1,ed 使用...

2019ICPC南昌邀請賽A (斯坦納樹)

大致題意 給定n個點,m條邊,給定4對點,要求將這4對點對應聯通,重複用邊只要算一次。思路還是先跑乙個斯坦納樹森林,然後合理狀態有所不同,需要一一對應,也就是對應位置必須同時出現。但是有個坑點,4對點中可能有的點會重複出現,所以對於狀態點用vector存一下相應的圖上點。具體避免方式看 這種模板題,...