首页 > 其他分享 >2024-04-01

2024-04-01

时间:2024-04-01 21:33:41浏览次数:13  
标签:01 puts 04 int ll 2024 后缀 include nm

2024-04-01

改题

第一天考试 T3

考场上主席树写挂了

正解是扫描线

树状数组下标是询问编号 维护 考虑从 1 到某个询问编号的 当前横坐标的高度

扫描到修改的左端点就 + h 右端点 - h
扫描到查询就在树状数组上二分第一个 >= y 的编号

代码第 75 行 ur 写成 ul 了,数组越界 调了一会

还有整体二分的方法,但是复杂度不对,常数小才能过

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;

typedef long long ll;

const int N=1e6+10;

int n,m;

struct Upd {
	int l,r;
	ll h;
}u[N];
struct Qry {
	int x;
	ll y;
	int ans;
}q[N];

vector<int> ul[N],ur[N],qx[N];

int lowbit(int x) {
	return x&-x;
}

ll tr[N];

void update(int x,ll k) {
	while(x<=m) {
		tr[x]+=k;
		x+=lowbit(x);
	}
	return;
}

ll query(int x) {
	ll res=0;
	while(x) {
		res+=tr[x];
		x-=lowbit(x);
	}
	return res;
}

void getans(int id,ll y) {
	if(query(id-1)<y) {
		q[id].ans=0;
		return;
	}
	int lft=1,rgh=id;
	while(lft<rgh) {
		int mid=lft+rgh>>1;
		if(query(mid)>=y) rgh=mid;
		else lft=mid+1;
	}
	q[id].ans=lft;
	return;
}

int main() {
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++) {
		int opt;
		scanf("%d",&opt);
		if(opt==1) scanf("%d%d%lld",&u[i].l,&u[i].r,&u[i].h),ul[u[i].l].push_back(i),ur[u[i].r].push_back(i);
		else scanf("%d%lld",&q[i].x,&q[i].y),qx[q[i].x].push_back(i);
	}
	for(int i=1;i<=n;i++) {
		for(int j=0;j<ul[i].size();j++) update(ul[i][j],u[ul[i][j]].h);
		for(int j=0;j<qx[i].size();j++) getans(qx[i][j],q[qx[i][j]].y);
		for(int j=0;j<ur[i].size();j++) update(ur[i][j],-u[ur[i][j]].h);
	}
	for(int i=1;i<=m;i++) if(q[i].x) printf("%d\n",q[i].ans); 
	
	return 0;
} 

第 2 题 subset

构造题
特判 n==1&&k==1 的情况
若 \(S=n\times(n+1)\bmod k\ne 0\) 肯定无解
记 m=n/k 若 m 为偶数,不难发现排成“蛇形”是符合条件的
否则如果 m 为奇数
这时候 n 肯定也是奇数,否则 S 不能被 k 整除
可以先把两边的大小配对排好,剩下一个 m=3 的情况
把这种情况解决就完事了

画几个 \(k=3,k=5,k=7\) 的情况
发现规律:

  • 第一列按顺序放
  • 第二列向上循环平移 \((k-1)/2\) 位
  • 第三列上半部分和下半部分(上比下多一个)分别是一个公差为 2 的等差数列,且上是奇数,下是偶数

做完了

代码里有一处 k 写成 m 了又是一直数组越界
感觉最近总是犯这种错误,好智障啊,浪费好多时间
还得再细心一点,写代码的时候脑子清楚点!

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;

typedef long long ll;

const ll N=1e6+10;

vector<ll> g[N];

ll n,k,m;

int main() {
	ll T;
	scanf("%lld",&T);
	while(T--) {
		scanf("%lld%lld",&n,&k);
		if(n==1&&k==1) {
			puts("Yes");
			puts("1");
			continue;
		}
		memset(g,0,sizeof(g));
		m=n/k;
		if(k==1) {
			puts("Yes");
			for(int i=1;i<=n;i++) printf("%d ",i);
			puts("");
			continue;
		}
		if(m==1) {
			puts("No");
			continue;
		}
		long long s=1ll*n*(n+1)/2;
		if(s%(long long)k!=0) {
			puts("No");
			continue;
		}
		if(m%2==0) {
			ll num=1;
			for(ll i=1;i<=m;i+=2) {
				for(ll j=1;j<=k;j++) g[j].push_back(num++);
				for(ll j=k;j>=1;j--) g[j].push_back(num++);
			}
			puts("Yes");
			for(ll i=1;i<=k;i++) {
				for(ll j=0;j<g[i].size();j++) printf("%lld ",g[i][j]);
				puts("");
			}
			continue;
		}
		if((n%2==0)&&(m%2==1)) {
			puts("No");
			continue;
		}
		for(ll d=0;d<(m-3)/2;d++) {
			for(ll i=1;i<=k;i++) g[i].push_back(i+d*k),g[i].push_back(n-i+1-d*k);
		}
		ll num=(m-3)/2*k+1;
		for(ll i=1;i<=k;i++) g[i].push_back(num++);
		for(ll i=k-(k-3)/2;i<=k;i++) g[i].push_back(num++);
		for(ll i=1;i<k-(k-3)/2;i++) g[i].push_back(num++);
		ll nm=num;
		for(ll i=(k+1)/2;i>=1;i--) g[i].push_back(nm),nm+=2;
		nm=num+1;
		for(ll i=k;i>(k+1)/2;i--) g[i].push_back(nm),nm+=2;
		puts("Yes");
		for(ll i=1;i<=k;i++) {
			for(ll j=0;j<g[i].size();j++) printf("%lld ",g[i][j]);
			puts("");
		}
	}
	
	return 0;
}

L语言

AC自动机 + DP

f[i] 表示 \(t\) 的从 \(1\) 到 \(i\) 这个前缀是否能够被理解

\(f[i]=\bigvee f[j]\) 其中 \([j+1,i]\) 这个字串 是 \(s\) 中的一个

AC自动机中 fail 就是一个前缀的后缀的集合
当一个后缀属于 \(s\) 的时候就可以转移

因为 \(\left|s\right|\le20\) 所以能转移的后缀长度最大是 \(20\) 这样我们就可以把他们压缩到一个数里

具体的
\(g_u\) 在二进制下的第 \(i\) 位表示 \(u\) 的长度为 \(i\) 的后缀是不是一个可以转移的后缀

然后我们再把第 \(i\) 位之前 \(20\) 位的 \(f\) 值压缩成 \(now\)(实现的时候是每次右移一位或上 \(f_{i-1}\),然后与上 \((1<<20)-1\) 保证 \(20\) 位之前的不存)

这样,如果 \(g_u\) 和 \(now\) 的某一位或某几位同时是 \(\tt True\) ,\(f_i=\tt True\)

就是按位与一下

【L语言】提交记录&Code

作业

昨天留的坑,填一下

每天完,明天继续

标签:01,puts,04,int,ll,2024,后缀,include,nm
From: https://www.cnblogs.com/Orange-Star/p/18107728

相关文章

  • 「训练日记」2024 年 4 月日记
    「训练日记」2024年4月日记点击查看目录目录「训练日记」2024年4月日记2024/04/01GalaxyUnion*2700Goshaishunting*3000LevelsandRegions*2400确实有必要写个东西监督自己.2024/04/01感谢奇蛋物语让我理解为什么巨人被喷烂尾.GalaxyUnion*2700神金.......
  • 2024.2.13力扣每日一题——二叉树的垂序遍历
    2024.2.13题目来源我的题解方法一TreeMap+深度优先遍历方法二官方题解(自定义排序)数组实现欢迎讨论(做题中遇到的一个问题)题目来源力扣每日一题;题序:987我的题解方法一TreeMap+深度优先遍历在递归形式的前、中、后序遍历中任选一种进行遍历,并在遍历过程中记......
  • 2024.2.16力扣每日一题——二叉树的锯齿形层序遍历
    2024.2.16题目来源我的题解方法一双端队列+标志题目来源力扣每日一题;题序:103我的题解方法一双端队列+标志层序遍历利用双端队列和标志,判断当前应该往那个方向遍历注意:在逆向遍历时,加入后续节点到队列中的顺序需要改变时间复杂度:O(N),其中N为二叉树的......
  • 04
    1字典的内置方法gf={"name":"高圆圆","age":32}(1)创建字典knowledge=['语文','数学','英语']scores=dict.fromkeys(knowledge,60)print(scores)(2)获取某键的值print(gf.get("name"))#"高圆圆get就......
  • 2024年新算法-冠豪猪优化算法(CPO),CPO-RF-Adaboost,CPO优化随机森林RF-Adaboost回归预
    冠豪猪优化算法(CPO)是一种基于自然界中猪群觅食行为启发的优化算法。该算法模拟了猪群在寻找食物时的集群行为,通过一系列的迭代过程来优化目标函数,以寻找最优解。在这个算法中,猪被分为几个群体,每个群体内的猪会根据当前的最佳解以及群体内部的协作信息来更新自身位置,以期望获得......
  • P8649 [蓝桥杯 2017 省 B] k 倍区间
    importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);//读取输入的整数n和kintn=sc.nextInt();//数组长度intk=sc.nextInt();//取模的值......
  • 2024年4月1日-简单场景绘制、打包验证资源
    先从导入的地图里,把地面复制过来 复制到默认地图 在材质里面找到光,可以修改光的强度 平整场地 用管理里面的删除和添加,弄出一大片平整的地形  把角色放到地图上 选到植物模式,把下载的素材包里的植物拖进去 然后随意丢一点素材到工程里 ......
  • 小球投盒(美团2024届秋招笔试第三场编程真题)
    核心思想用一个队列存储还没有球的盒子一旦有2操作那就剩下1个盒子没有球代码importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){TreeSet<Integer>q=newTreeSet<>();Scannerscanner=newScanner(System.in)......
  • 构建之法04
    在阅读《构建之法》这本书之前,我对于软件构建和工程开发的认知主要停留在实践层面,更多地依赖于日常项目中的经验和直觉。而这本书为我提供了一个全面而系统的视角,使我对软件开发的流程、技术和方法有了更深入的理解。在此,我将对比以往的做法,分享《构建之法》带给我的启示和差异。......
  • Public Easy Round #2 E. 2048
    Descriptionpb大师喜欢玩2048。pb大师在一个\(1\timesn\)的网格上玩2048,初始\(n\)个格子都是空的。游戏会进行若干轮,每轮将发生如下事件:如果没有空位,游戏结束。否则随机一个\(1\)到\(m\)的数,随机到\(i\)的概率是\(p_i\),再等概率随机一个空位,在空位中填入\(......