首页 > 其他分享 >LGJ OI 6.3

LGJ OI 6.3

时间:2023-08-12 23:23:14浏览次数:32  
标签:LGJ MN return OI int top sp long 6.3

t1 火柴

设计 \(f[i]\) 为 \(i\) 跟火柴最多的长度,\(g[i]\) 为 \(i\) 根火柴应选哪个放在首位。

考虑到前一位的重要性吊打后一位,显然让 \(f[i]\) 尽量大优先,不然就是 \(g[i]\) 取大。考虑记忆化搜索(DP)即可。

#include<bits/stdc++.h>
#define int long long
#define MN 100010 

using namespace std;

const int inf=1ll<<60;
int d[10]={0,2,5,5,4,5,6,3,7,6};
int n, m, a[MN], f[MN], g[MN];

void sol(int x) {
	if(x<=0||f[x]!=-1) return;
	for(int i=1; i<=m; ++i) {
		if(x-d[a[i]]<0) continue;
		sol(x-d[a[i]]);
		if(f[x-d[a[i]]]==inf) continue;
		if(f[x-d[a[i]]]+1>f[x]||f[x]==-1)
			f[x]=f[x-d[a[i]]]+1, g[x]=a[i];
		else if(f[x-d[a[i]]]+1==f[x]&&a[i]>g[x])
			g[x]=a[i]; 
	}
	if(f[x]==-1) f[x]=inf;
}

void print(int x) {
	if(x<=0) return;
	cout << g[x]; 
	print(x-d[g[x]]);
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m;
	for(int i=1; i<=m; ++i)
		cin >> a[i];
	memset(f,-1,sizeof(f));
	f[0]=0, sol(n), print(n);
	return 0;
}

t2 球赛

显然是 \(a*x+b*y=p\) 并且 \(0\leq x,y\) 并且 \(x+y\leq n\)

那么考虑他们的通解形式。

\(x=x_0+(p/b)k,y=y_0-(p/a)k\)

首先非负是一种限制,给了一个 \(k\) 的上下界。

那么显然要想 \(x+y\) 尽量小,又 \(b\leq a\),肯定把 \(k\) 取的最边。

那不是拓欧板子?注意到会爆 longlong /fad

\(a,b\) 很小但是其它很大,然后因为尽量小的约束 \(y\) 也是范围很小。

所以我们枚举 \(y\) 去算就行了(((

#include<bits/stdc++.h>
#define int long long

using namespace std;

int n, p, a, b;

signed main() {
   ios::sync_with_stdio(0);
   cin.tie(0);
   cin >> n >> p >> a >> b;
   for(int y=0; y<=2e5; ++y)
   	if((p-b*y)%a==0) {
   		int x=(p-b*y)/a;
   		if(x>=0&&x+y<=n) {
   			cout << x << " " << y << " " << n-x-y;
   			return 0;
   		}
   	}
   cout << -1;
   return 0;
}

t3 摆渡车

根据题意,设答案为 \(l\),显然有

\(l\equiv x+[0,y)\pmod {2x+2y}\)

\(l\equiv p+[0,q)\pmod {p+q}\)

注意到 \(p,q\) 小的要命,选择直接枚举+EXCRT。

要龟速乘法 wwww /dk/dk/dk/dk

其实我这个代码是可以少 log 的,因为 exgcd 重复算了一样的。

#include<bits/stdc++.h>
#define int long long

using namespace std;

int mul(int a,int b,int p) {
	b=(b%p+abs(p))%p;
	int res=0;
	for( ; b; b>>=1) {
		if(b&1) res=(res+a)%p;
		a=(a+a)%p;
	}
	return res;
}

int exgcd(int a,int b,int &x,int &y) {
    if(b==0) {
    	x=1, y=0;
    	return a;
	}
    int d=exgcd(b,a%b,x,y);
    int t=x; x=y, y=t-a/b*y;
    return d;
}

int sol(int x0,int m,int ai,int mi) {
	x0%=m, ai%=mi;
	int x, y, d=exgcd(m,mi,x,y);
	if((ai-x0)%d!=0) return 1ll<<60;
	int mt=m/__gcd(mi,m)*mi;
	x=mul((ai-x0)/d,x,mt);
	x0=(mul(x,m,mt)+x0)%mt;
	return (x0%mt+mt)%mt;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int g, x, y, p, q;
	cin >> g;
	while(g--) {
		cin >> x >> y >> p >> q;
		int ans=1ll<<60;
		for(int i=0; i<y; ++i)
			for(int j=0; j<q; ++j) {
				ans=min(ans,sol(x+i,2*(x+y),p+j,p+q));
			}
		if(ans==1ll<<60) cout << "infinity\n";
		else cout << ans << endl;
	}
	return 0;
}

t4 灯与开关

首先来一大波离散化(不知道怎么形容。

我们搞 \([u,v]\) 在离散花的数组里面包含那个区间,是这么算。

r=lower_bound(sp,sp+1+top,u)-sp;
c=upper_bound(sp,sp+1+top,v)-sp-1;

嗯嗯。

看会题目,首先 xor 差分,这样就区间变双点啦。

就变成了一个图,每次把一条边两个端点取反。

这玩意儿 lgj 讲过的说(

首先对于里面其中的很多个连通图,我们选择分别处理。

对于一个图,当且仅当里面 1 的点的个数为偶数时有解。

为什么呢?我们随便拉两个 1 把他们间的路径都用一次,那么这两个 1 变成 0,其它不变,这个奇偶性不会变,如果是一条边被弄了很多次,我们两次操作贡献抵消就行了捏(

之后考虑怎么构造答案,我们这个图的随便一颗搜索树肯定也有解,前提是这个图它有解,对于这棵树,从叶子网上算就很显然了 qwq

#include<bits/stdc++.h>
#define int long long
#define MN 400010

using namespace std;

int n, m, sp[MN], top, vis[MN], d[MN], rs;
int hd[MN], nxt[MN], to[MN], tot, id[MN];
struct dat { int a, b; } p[MN];

bool cmp(dat ix,dat iy) {
    return ix.a<=iy.a;
}

void eadd(int u,int v,int i) {
    to[++tot]=v;
    id[tot]=i;
    nxt[tot]=hd[u];
    hd[u]=tot;
}

void sol(int x,int fa) {
    vis[x]=1;
    for(int i=hd[x]; i; i=nxt[i]) {
        int y=to[i];
        if(vis[y]) continue;
        sol(y,fa);
        if(p[y].b) p[x].b^=1, rs++, d[i]=1;
    }
    if(x==fa&&p[x].b) {
        cout << -1;
        exit(0);
    }
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    for(int i=1; i<=n; ++i) {
        cin >> p[i].a >> p[i].b;
        sp[i]=p[i].a;
    }
    sort(sp+1,sp+1+n);
    top=unique(sp+1,sp+1+n)-sp-1;
    sort(p+1,p+1+n,cmp);
    p[n+1].b=p[n].b^0;
    for(int i=n; i>=1; --i) {
        p[i].a=lower_bound(sp+1,sp+1+top,p[i].a)-sp;
        p[i].b^=p[i-1].b;
    }
    for(int i=1; i<=m; ++i) {
        int u, v, r, c;
        cin >> u >> v;
        r=lower_bound(sp,sp+1+top,u)-sp;
        c=upper_bound(sp,sp+1+top,v)-sp;
        if(r!=c) eadd(r,c,i), eadd(c,r,i);
    }
    for(int i=1; i<=n+1; ++i)
        if(vis[i]==0) sol(i,i);
    cout << rs << endl;
    for(int i=2; i<=tot; ++i)
        if(d[i]) cout << id[i] << " ";
    return 0;
}

标签:LGJ,MN,return,OI,int,top,sp,long,6.3
From: https://www.cnblogs.com/chelsyqwq/p/17625823.html

相关文章

  • IDEA/Android Studio的gradle控制台输出中文乱码问题解决
    原文地址:IDEA/AndroidStudio的gradle控制台输出中文乱码问题解决-Stars-One的杂货小窝在项目中,有使用到Gradle自定义脚本,会有些输出日志,但是输出中文就变成乱码了..本篇就介绍下解决方法乱码效果如下图所示步骤我是window系统,不知道其他系统会不会出现这个问题乱......
  • Android Studio Giraffe安装与gradle配置
    本机环境:win10专业版,64位,16G内存。原先用的AS2.2,是很早之前在看《第一行代码Android(第2版)》的时候,按书里的链接下载安装的,也不用怎么配置。(PS:第一行代码这本书对新手确实很适合,第1版是eclise,第2版是Androidstudio)最近想给AS升级一下,果不其然碰到很多问题。......
  • Android系统启动-SystemServer上篇-1
    相关文件:/frameworks/base/core/java/com/android/internal/os/-ZygoteInit.java-RuntimeInit.java-Zygote.java/frameworks/base/services/java/com/android/server/-SystemServer.java/frameworks/base/core/jni/-com_android_internal_os_Zygote.cp......
  • LGJOI20230812
    LGJ水场。这场总体题比较简单,所以分比较高。A有\(n\)项工作,完成一项工作需要\(1\)单位时间。每项工作有个截止时间\(t\)和报酬\(v\),需要在第\(t\)单位时间前完成工作才能得到\(v\)的报酬。给定\(T\),求\(T\)时间后获得报酬的最大值。solution:简单贪心。将工作......
  • Android的onAttach方法是在 Fragment 与其宿主 Activity 关联时调用的,用于建立 Fragme
    在Android中,Fragment的初始化数据通常不应该放在onAttach方法中。onAttach方法是在Fragment与其宿主Activity关联时调用的,用于建立Fragment与Activity之间的关联。这个方法主要用于执行与宿主Activity相关的操作,例如获取Activity的引用或初始化一些与Activity......
  • 洛谷 P7739 - [NOI2021] 密码箱
    感觉难度和今年D2T2差不多。首先一个很显然的事情是,每一步得到的分数的分子分母都是互质的,证明参考SBT。而最后答案要求我们将分子分母都求出来而不是求分数值,所以可以很明显的想到将分数当成一个二元组然后维护变换。考虑从右往左扫,假设当前分数为\(\dfrac{x}{y}\),那么扫过......
  • 讨伐OI
    时常看到很多人说OI最简单,或者OI对升学没有什么用,也有些人说近些年的OI出的很好,体现了思维性和竞赛的意义。有些人说竞赛就是为了选拔人才,不需要选那么多。起初我还会反驳,见的多了,也就懒得了。我觉得,OI(信息学竞赛)的目的就是为了让更多的人接触更深刻更前沿的计算机科学,就是做一......
  • Java+Excel+POI+testNG基于数据驱动做一个简单的接口测试【杭州多测师_王sir】
    一、创建一个apicases.xlsx放入到eclipse的resource里面,然后refresh刷新一下二、在pom.xml文件中加入poi和testng的mvnrepository、然后在eclipse的对应目录下放入features和plugins,重启eclipse就可以看到testNG了<!--poiexcel解析--><dependency>......
  • LGJOI20230811
    は?——ロキA给定整数\(L,R\(L\\le\R)\),请计算满足以下条件的整数对\((x,y)\)的数量:\(L\\le\x,y\\le\R\)设\(g\)是\(x,y\)的最大公约数,则满足以下条件:\(g\\neq\1\)且\(\frac{x}{g}\\neq\1\)且\(\frac{y}{g}\\neq\1\)solution:简单莫反。先......
  • 动态规划大全oi-wiki
    背包DP背包DP区间DP区间DPDAG上的DPDAG上的DP树形DP树形DP状压DP状压DP数位DP数位DP插头DP插头DP计数DP计数DP动态DP动态DP概率DP概率DPDP优化DP优化......