2018多校2

C

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<map>
#include<string>
#include<vector>
#include<set>
#include<bitset>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define ull unsigned long long
#define endl '\n'
#define clr(a) memset(a, 0, sizeof(a))
#define lowbit(x) x & -x
#define ls rt << 1, l, mid
#define rs rt << 1 | 1, mid + 1, r
#define PB push_back
#define POP pop_back
const double pi = acos(-1);
const int maxn = 1e5 + 10;
const int maxm = 1200;
const ll mod = 1e9 + 7;
const int hash_mod = 19260817;
int cnt, n, m, num;
int head[maxn], vis[maxn], vis_e[maxn<<2], du[maxn];
vector<int> ans[maxn], v;
struct node{
    int to, next;
}edge[maxn << 2];
void add(int u, int v){
    edge[++cnt].to = v;
    edge[cnt].next = head[u];
    head[u] = cnt;
}
void init(){
    int u, v;
    clr(head); clr(vis); clr(vis_e); clr(du);
    cnt = 1; num = 0;
    for(int i = 1 ; i <= m ; ++ i){
        scanf("%d %d", &u, &v);
        add(u, v); add(v, u);
        du[u] ++; du[v] ++;
    }
}
void dfss(int u){
    for(int i = head[u] ; i != 0 ; i = edge[i].next){
        if(!vis_e[i]){
            vis_e[i] = vis_e[i^1] = 1;
            int v = edge[i].to;
            dfss(v);
            if(i > 2 * m + 1) num ++;
            else (i & 1) ? ans[num].PB(i/2) : ans[num].PB(-i/2);
        }
    }
}
void dfs(int u){
    vis[u] = 1;
    if(du[u] & 1) v.PB(u);
    for(int i = head[u] ; i != 0 ; i = edge[i].next){
        int v = edge[i].to;
        if(vis[v]) continue;
        dfs(v);
    }
}
void solve(){
    for(int i = 1 ; i <= n ; ++ i){
        if(!vis[i] && du[i]){
            dfs(i);
            for(int j = 2 ; j < v.size() ; j += 2){
                add(v[j], v[j+1]);
                add(v[j+1], v[j]);
            }
            num ++;
            if(v.size()) dfss(v[0]);
            else dfss(i);
            v.clear();
        }
    }
    cout << num << endl;
    for(int i = 1 ; i <= num ; ++ i){
        int sz = ans[i].size();
        cout << sz << ' ';
        for(int j = 0 ; j < sz ; ++ j){`在这里插入代码片`
            cout << ans[i][j] << ' ';
        }
        ans[i].clear();
        cout << endl;
    }
}
int main(){
    while(~scanf("%d %d", &n, &m)){
        init();
        solve();
    }
    return 0;
}

D

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
const int  maxn = 1e6+7;
int main (){
	int n;
	while(~scanf("%d",&n))
	cout<<"Yes"<<endl;
		return 0;
} 

G

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<map>
#include<string>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define ull unsigned long long
#define endl '\n'
const double pi = acos(-1);
const int maxn = 1e5 + 10;
const int maxm = 1200;
const ll mod = 109;
int n, m;
char s[10];
int mn[maxn<<2], pre[maxn<<2], lazy[maxn<<2], b[maxn];
void pushdown(int p){
    if(lazy[p]){
        lazy[p<<1] += lazy[p]; lazy[p<<1|1] += lazy[p];
        mn[p<<1] -= lazy[p]; mn[p<<1|1] -= lazy[p];
        lazy[p] = 0;
        return;
    }
}
void pushup(int p){
    mn[p] = min(mn[p<<1], mn[p<<1|1]);
    pre[p] = pre[p<<1] + pre[p<<1|1];
}
void build(int p, int l, int r){
    lazy[p] = 0;
    pre[p] = 0;
    if(l == r){
        mn[p] = b[l];
        return;
    }
    int mid = (l + r) >> 1;
    if(l <= mid) build(p << 1, l, mid);
    if(r > mid) build(p << 1 | 1, mid + 1, r);
    pushup(p);
}
void update(int p, int l, int r, int L, int R){
    if(L <= l && r <= R && mn[p] > 1){
        lazy[p] ++;
        mn[p] --;
        return;
    }
    if(l == r){
        mn[p] = b[l];
        pre[p] ++;
        return;
    }
    pushdown(p);
    int mid = (l + r) >> 1;
    if(L <= mid) update(p << 1, l, mid, L, R);
    if(R > mid) update(p << 1 | 1, mid + 1, r, L, R);
    pushup(p);
}
ll query(int p, int l, int r, int L, int R){
    if(L <= l && r <= R) return pre[p];
    pushdown(p);
    ll ans = 0;
    int mid = (l + r) >> 1;
    if(L <= mid) ans += query(p << 1, l, mid, L, R);
    if(R > mid) ans += query(p << 1 | 1, mid + 1, r, L, R);
    return ans;
}
int main(){
    int l, r;
    while(~scanf("%d  %d", &n, &m)){
        for(int i = 1 ; i <= n ; ++ i) scanf("%d", &b[i]);
        build(1, 1, n);
        while(m--){
            scanf("%s %d %d", s, &l, &r);
            if(s[0] == 'a') update(1, 1, n, l, r);
            if(s[0] == 'q'){
                /*for(int j = 1 ; j <= n ; ++ j){
                    cout << query(1, 1, n, j, j) << ' ';
                }
                cout << endl;*/
                cout << query(1, 1, n, l, r) << endl;
            }

        }
    }
	return 0;
}

J

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<map>
#include<string>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define ull unsigned long long
#define endl '\n'
const double pi = acos(-1);
const int maxn = 1e5 + 10;
const int maxm = 1200;
const ll mod = 109;
int a[maxn], rr[maxn], n;
ll ans;
void msort(int l, int r){
    if(l == r) return;
    int mid = l + (r - l) / 2;
    msort(l, mid);
    msort(mid + 1, r);
    int i = l, j = mid + 1, k = l;
    while(i <= mid && j <= r){
        if(a[i] <= a[j]){
            rr[k++] = a[i++];
        }
        else{
            ans += mid - i + 1;
            rr[k++] = a[j++];
        }
    }
    while(i <= mid) rr[k++] = a[i++];
    while(j <= r) rr[k++] = a[j++];
    for(int i = l ; i <= r ; ++ i) a[i] = rr[i];
}
int main(){
    int x, y;
    while(~scanf("%d %d %d", &n, &x, &y)){
        for(int i = 1 ; i <= n ; ++ i) scanf("%d", &a[i]);
        ans = 0;
        msort(1, n);
        //for(int i = 1 ; i <= n ; ++ i) cout << a[i] << " ";
        printf("%lld\n", ans * min(x, y));
    }
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值