2019 ICPC 南昌现场赛 重现(部分)

A. Attack

poj 3123
板子题 斯坦纳树
板子 如下

const int maxm=2009;
const int maxn=39;
const int inf=0x3f3f3f3f;
 
struct Edge{
    int v,w,next;
}edge[maxm];
 
int head[maxn],top;
 
void init(){
    memset(head,-1,sizeof(head));
    top=0;
}
 
void add(int u,int v,int w){
    edge[top].v=v;
    edge[top].w=w;
    edge[top].next=head[u];
    head[u]=top++;
}
 
queue<int> q;
 
int stns[1<<9][maxn];
bool vis[1<<9][maxn];
 
void spfa(int sta){
    int u,v,w;
    while(!q.empty()){
        u=q.front(); q.pop();
        vis[sta][u]=0;
        for(int i=head[u];i!=-1;i=edge[i].next){
            v=edge[i].v;
            w=edge[i].w;
            if(stns[sta][v]>stns[sta][u]+w){
                stns[sta][v]=stns[sta][u]+w;
                if(!vis[sta][v]){
                    vis[sta][v]=1;
                    q.push(v);
                }
            }
        }
    }
}
int can[maxn];//为1表示这个点是点集中的点;
 
int STNS(int n,int id){//所有点数,斯坦纳点个数;
    int MAX=(1<<id)-1;
    memset(stns,0x3f,sizeof(stns));
    for(int i=1;i<=n;++i)
        if(can[i]) stns[(1<<id)-1][i]=0;
    for(int sta=1;sta<=MAX;++sta){
        for(int i=1;i<=n;++i){
            for(int son=sta&(sta-1);son;son=(son-1)&sta)
                stns[sta][i]=min(stns[sta][i],stns[son][i]+stns[sta-son][i]);
            if(stns[sta][i]!=inf&&vis[sta][i]==0){
                q.push(i);
                vis[sta][i]=1;
            }
        }
        spfa(sta);
    }
    int res=inf;
    for(int i=1;i<=n;++i)
        res=min(res,stns[MAX][i]);
    return res;
}

F. Sequence

找规律 偶数长度 贡献度 0
奇数长度 奇数位贡献 1次

#include <iostream>
#include <cstdio>
#include <algorithm>
typedef long long ll;
using namespace std;

const int maxn = 1e5 + 10;
const int INF = 0x3f3f3f3f;
int data[maxn];
int tree[maxn << 2][2];

void push_up(int rt) {
	tree[rt][0] = tree[rt << 1][0] ^ tree[rt << 1 | 1][0] ;
	tree[rt][1] = tree[rt << 1][1] ^ tree[rt << 1 | 1][1] ;
}

void buid(int l, int r, int rt) {
	if(l == r) {
		if(l % 2 == 0)
			tree[rt][0] = data[l];
		else
			tree[rt][1] = data[l];
		return;
	}
	int mid = l + r >> 1;
	buid(l, mid, rt << 1);
	buid(mid + 1, r, rt << 1 | 1);
	push_up(rt);
}

void update(int L, int d, int l, int r, int rt, int k) {
	if(l == r) {
		tree[rt][k] = d;
		return;
	}
	int mid = l + r >> 1;
	if(L <= mid)
		update(L, d, l, mid, rt << 1, k);
	else
		update(L, d, mid + 1, r, rt << 1 | 1, k);
	push_up(rt);
}

int find(int L, int R, int l, int r, int rt, int k) {
	if(L <= l && R >= r) {
		return tree[rt][k];
	}
	int mid = (l + r) >> 1;
	ll ans = 0;
	if(L <= mid)
		ans ^= find(L, R, l, mid, rt << 1, k);
	if(R > mid)
		ans ^= find(L, R, mid + 1, r, rt << 1 | 1, k);
	return ans;
}

int main() {
	int t;
	scanf("%d", &t);
	int cas = 1;
	while(t --) {
		int n, m;
		scanf("%d %d", &n, &m);
		for(int i = 1; i <= n; i++) scanf("%d", &data[i]);

		buid(1, n, 1);
		printf("Case #%d:\n", cas++);
		while(m--) {
			int cmd, l, r;
			scanf("%d %d %d", &cmd, &l, &r);
			if(cmd == 0)
				if(l % 2 == 0)
					update(l, r, 1, n, 1, 0);
				else
					update(l, r, 1, n, 1, 1);
			else if((r - l + 1) % 2 == 0) printf("0\n");
			else if(l % 2 == 0) printf("%d\n", find(l, r, 1, n, 1, 0));
			else printf("%d\n", find(l, r, 1, n, 1, 1));
		}
	}
	return 0;
}

G. Winner

我们按3个排序 把最大的标记1 然后权值有小到大 不断 扫 把一之后跟新 为1 直到没有跟新退出

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
typedef long long ll;

const int maxn = 1e5 + 5;
const int INF = 0x3f3f3f3f;

struct node {
    int num;
    int val;
    bool operator < (const node &a) const {
        return val < a.val;
    }
} data[maxn], data2[maxn], data3[maxn];
bool vis[maxn];

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    int a = 0, b = 0, c = 0;
    for(int i = 1; i <= n; i++) {
        data[i].num = i;
        scanf("%d", &data[i].val);
        if(data[i].val > data[a].val) a = i;
    }
    for(int i = 1; i <= n; i++) {
    	data2[i].num = i;
        scanf("%d", &data2[i].val);
        if(data2[i].val > data2[b].val) b = i;
    }
    for(int i = 1; i <= n; i++) {
    	data3[i].num = i;
        scanf("%d", &data3[i].val);
        if(data3[i].val > data3[c].val) c = i;
    }
    vis[a] = vis[b] = vis[c] = 1;
    sort(data + 1, data + 1 + n);
    sort(data2 + 1, data2 + 1 + n);
    sort(data3 + 1, data3 + 1 + n);

    while(1) {
        bool flag = 0;
        bool tt = 0;
        for(int i = 1; i <= n; i++) {
            if(vis[data[i].num] == 1) flag = 1;
            if(flag == 1 && vis[data[i].num] == 0) {
                tt = 1;
				vis[data[i].num] = 1;
            }
        }

        flag = 0;
        for(int i = 1; i <= n; i++) {
            if(vis[data2[i].num] == 1) flag = 1;
            if(flag == 1 && vis[data2[i].num] == 0) {
                tt = 1;
				vis[data2[i].num] = 1;
            }
        }

        flag = 0;
        for(int i = 1; i <= n; i++) {
            if(vis[data3[i].num] == 1) flag = 1;
            if(flag == 1 && vis[data3[i].num] == 0) {
                tt = 1;
				vis[data3[i].num] = 1;
            }
        }
        if(tt == 0) break;
    }

    while(m--) {
        int p;
        scanf("%d", &p);
        if(vis[p] == 1) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务