Codeforces Round #529 (Div. 3)

A  输出第1 2 4 7...位置的字母即可

#include 
#define fir first
#define se second
#define ll long long
#define pb push_back
#define mp make_pair
#define ull unsigned long long 
#define cl(a,b) memset(a,b,sizeof(a))
#define quickio(a) ios::sync_with_stdio(a)
#define datatest() freopen("data.in","r",stdin)
#define pii pair  
#define pdd pair
using namespace std;
const int maxn=2e5+10;
const int maxm=1e6+10;
const ll INF=1e12;
const ll mod=1e9+8;
const int maxblock=sqrt(1e9)+10;
int n;
char str[maxn];

int main(){
    while (~scanf("%d",&n)){
        scanf("%s",str+1);
        string ans;
        int pos=1;
        for (int i=1;i<=10;i++){
            if (pos>n) break;
            ans+=str[pos];
            pos+=i;
        }
        cout<

B 只有在删掉最小/最大的那个值才会有可能更改答案 排序后只要在最小值/最大值的地方讨论即可

#include 
#define fir first
#define se second
#define ll long long
#define pb push_back
#define mp make_pair
#define ull unsigned long long 
#define cl(a,b) memset(a,b,sizeof(a))
#define quickio(a) ios::sync_with_stdio(a)
#define datatest() freopen("data.in","r",stdin)
#define pii pair  
#define pdd pair
using namespace std;
const int maxn=2e5+10;
const int maxm=1e6+10;
const ll INF=1e12;
const ll mod=1e9+8;
const int maxblock=sqrt(1e9)+10;
int n,a[maxn];

int main(){
    while (~scanf("%d",&n)){
        for (int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        int res=a[n]-a[1];
        res=min(res,a[n]-a[2]);
        res=min(res,a[n-1]-a[1]);
        printf("%d\n",res);
    }
    return 0;
}

C 枚举n的为1的二进制位,如果这时候数量不够 就把这个位*2补到下一位 直到满足条件或者所有数都拆成1


 #include 
#define fir first
#define se second
#define ll long long
#define pb push_back
#define mp make_pair
#define ull unsigned long long 
#define cl(a,b) memset(a,b,sizeof(a))
#define quickio(a) ios::sync_with_stdio(a)
#define datatest() freopen("data.in","r",stdin)
#define pii pair  
#define pdd pair
using namespace std;
const int maxn=2e5+10;
const int maxm=1e6+10;
const ll INF=1e12;
const ll mod=1e9+8;
const int maxblock=sqrt(1e9)+10;
map ma;
int n,k;
int num=0;

int main(){
    scanf("%d %d",&n,&k);
    for (int i=0;i<30;i++){
        if (n&(1<0;i--){
        if (num>k) break;
        if (ma.count(1<dif){
            ma[1<<(i-1)]+=2*dif;
            ma[1<=0;i--){
            if (ma[1<

D 枚举第一个的情况 之后check一遍即可

#include 
#define fir first
#define se second
#define ll long long
#define pb push_back
#define mp make_pair
#define ull unsigned long long 
#define cl(a,b) memset(a,b,sizeof(a))
#define quickio(a) ios::sync_with_stdio(a)
#define datatest() freopen("data.in","r",stdin)
#define pii pair  
#define pdd pair
using namespace std;
const int maxn=2e5+10;
const int maxm=1e6+10;
const ll INF=1e12;
const ll mod=1e9+8;
const int maxblock=sqrt(1e9)+10;
int n;
int a[maxn][2];
vector res;
int solve(int p1,int p2){
    res.clear();
    res.pb(1);
    res.pb(a[1][p1]);
    res.pb(a[1][p2]);
    for (int i=1;i<=n-2;i++){
       /* cout<<"i="<

E 预处理出括号序列的前缀和之后

对于一个位置从)改成( 相当于从他开始之后的所有位置+2

所以只要判断1~i-1的最小值是否大于等于0且i到n的最小值是否大于等于-2

用线段树维护即可

(改成)是类似的

#include 
#define fir first
#define se second
#define ll long long
#define pb push_back
#define mp make_pair
#define ull unsigned long long 
#define cl(a,b) memset(a,b,sizeof(a))
#define quickio(a) ios::sync_with_stdio(a)
#define datatest() freopen("data.in","r",stdin)
#define pii pair  
#define pdd pair
using namespace std;
const int maxn=1e6+10;
const int maxm=1e6+10;
const ll INF=1e12;
const ll mod=1e9+8;
const int maxblock=sqrt(1e9)+10;
char str[maxn];
int n;
int tree[maxn<<2];
int sum[maxn];
void pushup(int rt){
    tree[rt]=min(tree[rt<<1],tree[rt<<1|1]);
}
void build(int rt,int l,int r){
    if (l==r){
        tree[rt]=sum[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    pushup(rt);
}
int query(int rt,int l,int r,int L,int R){
    if (L>R){
        return 1;
    }
    int Min=1e8;
    if (l>=L&&r<=R) return tree[rt];
    int mid=(l+r)>>1;
    if (L<=mid){
        Min=min(Min,query(rt<<1,l,mid,L,R));
    }
    if (R>mid){
        Min=min(Min,query(rt<<1|1,mid+1,r,L,R));
    }
    return Min;
}
int main(){
    while (~scanf("%d",&n)){
        scanf("%s",str+1);
        sum[0]=0;
        for (int i=1;i<=n;i++){
            if (str[i]=='(')
                sum[i]=sum[i-1]+1;
            else sum[i]=sum[i-1]-1;
        }
        build(1,1,n);
        int ans=0;
        for (int i=1;i<=n;i++){
            if (str[i]=='('){
                if (sum[n]!=2) continue;
                int Min=query(1,1,n,i,n);
                int Min1=query(1,1,n,1,i-1);
                if (Min>=2&&Min1>=0){
                    //cout<<"i="<=-2&&Min1>=0){
                   // cout<<"i="<

F 如果没有特殊边 显然是把a最小的点跟其他点连成一个菊花图

只要把这n-1条边跟m条边一起跑一个mst出来就可以了

#include 
#define fir first
#define se second
#define ll long long
#define pb push_back
#define mp make_pair
#define ull unsigned long long 
#define cl(a,b) memset(a,b,sizeof(a))
#define quickio(a) ios::sync_with_stdio(a)
#define datatest() freopen("data.in","r",stdin)
#define pii pair  
#define pdd pair
using namespace std;
const int maxn=2e5+10;
const int maxm=1e6+10;
const ll INF=1e12;
const ll mod=1e9+8;
const int maxblock=sqrt(1e9)+10;
struct Edge{
    int u,v;
    ll w;
};
vector V;
int n,m;
ll a[maxn];
int cmp(Edge a,Edge b){
    return a.w

 

你可能感兴趣的:(codeforces)