好的,现在正式定义今天的比赛为一场伤心的比赛。


↑这张图片首先能说明一些问题,但这并不是关键。


↓这才是伤心的关键

↑第一题文件输入输入爆

↑第二题文件名直接爆

评语,一个比一个离谱!


然后只是很简单的把这两个小错误改正确以后就有83分了,不知道该喜还是该悲

上图

Ps:这是第一次犯这种SB错误,主要是平时自己就很小心。但依旧:

吃一堑,长一智

好的,就在刚刚,一脸雾水听完题目分析出来,又发现一个惊人事实,那就是我T2的文件输入输出名都是错的!!!!

(狂喜)

T1 graph



首先考虑暴力做法+优化,拿了54分,思路是遍历每一个点,一每一个点为起点, dfs 深搜 K 个节点,跟 ans 取个最大值,最优解一定在这其中。

54分代码:

#include<bits/stdc++.h>
using namespace std;//听我说谢谢你,因为有你。。。。
#define N 20000
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int nex[N],first[N],w[N],to[N],tot=0,vis[N];
int n,m,k,ans;
void add(int x,int y,int z){
nex[++tot]=first[x];
first[x]=tot;
to[tot]=y;
w[tot]=z;
}
void dfs(int u,int fa,int st,int sum){
if(st==k){
ans=max(ans,sum);
return ;
}
++st;
for(int e=first[u];e;e=nex[e]){
int v=to[e];
if(v!=fa&&vis[v]==0){
vis[v]=1;
sum+=w[e];
// printf("u%d,v%d,w%d,st%d,sum%d\n",u,v,w[e],st,sum);
dfs(v,u,st,sum);
vis[v]=0;
sum-=w[e];
}
}
}
int main(){
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout);
int T;
T=read();
while(T--){
n=read();
m=read();
k=read();
tot=0;
ans=0;
memset(first,0,sizeof(first));
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++){
int a,b,c;
a=read();b=read();c=read();
add(a,b,c);
add(b,a,c);
}
for(int i=1;i<=n;i++){
dfs(i,0,1,0);
}
if(ans!=0) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}

思考正解做法,

color coding 对图中的点随机染色,色彩个数为 k,然后进行 dp,设 \(f[i][S]\) 为当前 i 点颜色合集为 S 的权值。

令所有 \(f[i][S] = −inf\),然后对于每个顶点 x 和其颜色 col[x],f[1 << col[x]][x] = 0。然后从小到大枚举状态 S,

每一个状态 S 下枚举边,对于每条边我们记其相邻 2 端为 xx, yy,边权为 zz。

\[f[xx][S] = max(f[xx][S], f[yy][S xor (1 << col[xx])] + zz)
\]
\[f[yy][S] = max(f[yy][S], f[xx][S xor (1 << col[yy])] + zz)
\]

重复执行足够多次以后取最优解。

#include<bits/stdc++.h>
const int N=1e4+5,B=500;
using namespace std;
mt19937 rnd(19260817);
int n,m,k,col[N],S;
struct edge{int x,y,z;}e[N];
int f[N][64];
int check()
{
for(int i=1;i<=n;i++)
{
for(int j=0;j<S;j++)f[i][j]=-2e9;
f[i][1<<col[i]]=0;
}
for(int j=0;j<S;j++)
for(int i=1,xx,yy,zz;i<=m;i++)
{
xx=e[i].x;yy=e[i].y;zz=e[i].z;
if((j>>col[xx])&1)f[xx][j]=max(f[xx][j],f[yy][j^(1<<col[xx])]+zz);
if((j>>col[yy])&1)f[yy][j]=max(f[yy][j],f[xx][j^(1<<col[yy])]+zz);
}
int res=-1;
for(int i=1;i<=n;i++)res=max(res,f[i][S-1]);
return res;
}
int ans;
int T;
int main()
{
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout);
ios::sync_with_stdio(false);cin.tie(0);
cin>>T;
while(T--){
cin>>n>>m>>k;S=1<<k;
for(int i=1;i<=m;i++)cin>>e[i].x>>e[i].y>>e[i].z;
ans=-1;
for(int i=1;i<=B;i++){
for(int j=1;j<=n;j++)col[j]=rnd()%k;
ans=max(ans,check());
}
cout<<ans<<'\n';
}
return 0;
}

T2 random

随机

这道题考场没写出暴力,啥,暴力都没写出来,主要是图的数据结构只会邻接表,不会以边存图。

来看一看全场做高分80分陈鑫的做法:模拟退货,而且思想异常的朴素,这就是高手与我的区别吗,随机将点排个序,然后遍历一遍,求前第 i 个做删点处理的代价,多做几次求 min。

80分大佬代码:

#include <bits/stdc++.h>
#define eb emplace_back
using namespace std;
using ll = long long;
mt19937 mt(random_device{}());
int t, n, m;
ll a, b;
ll ans;
pair <int, int> ed[45];
vector <int> gra[45];
bool mp[45][45];
bool vis[45];
int bs[45];
ll js() {
ll ans = a * m;
for (int j = 0; j <= n; ++j) {
memset(vis, 0, sizeof(vis));
int totp = j;
for (int i = 1; i <= j; ++i) {
bool flag = 0;
for (auto &k : gra[bs[i]]) {
if (!vis[k]) flag = 1;
vis[k] = 1;
}
if (!flag) --totp;
}
int tot = 0;
for (int k = 0; k < m; ++k) if (vis[k]) ++tot;
ans = min(ans, b * totp + a * (m - tot));
}
return ans;
}
void mnth() {
double T = 100000, dt = 0.99;
while (T > 1e-8) {
int x = mt() % (n - 1) + 1, y = mt() % (n - x) + x + 1;
swap(bs[x], bs[y]);
ll tmp = js();
if (tmp < ans) {
ans = tmp;
} else if (exp(- abs(ans - tmp) / T) * 6553600 < mt() % 6553600) {
swap(bs[x], bs[y]);
}
T *= dt;
}
}
int main() {
freopen("random.in", "r", stdin);
freopen("random.out", "w", stdout);
scanf("%d", &t);
while (t--) {
scanf("%d%d%lld%lld", &n, &m, &a, &b);
for (int i = 1; i <= n; ++i) gra[i].clear();
memset(mp, 0, sizeof(mp));
memset(bs, 0, sizeof(bs));
ans = 1e18;
for (int i = 0; i < m; ++i) {
scanf ("%d%d", &ed[i].first, &ed[i].second);
gra[ed[i].first].eb(i);
gra[ed[i].second].eb(i);
}
for (int i = 1; i <= n; ++i) bs[i] = i;
srand(time(NULL));
random_shuffle(bs + 1, bs + n + 1);
mnth();mnth();mnth();
mnth();mnth();mnth();
mnth();mnth();mnth();
printf("%lld\n", ans);
}
return 0;
}

T3 substring

子串Ⅰ

考场上做了个简单判断,按照二的幂次分别输出0和1,然后随机情况输出0和1,竟然骗 了29.没想到这道题正解竟然是根据特殊性质做的,叫个什么 De Bruijn 序列。跑了,跑了。

不过部分分是可以拿de:

M.A.Martin 于 1934 年证明了以下贪心算法对所有的 n ≥ 2 都可以构造出一个长度

2n 的 De Bruijn 序列:

  1. 写出 n 个 0。

  2. 如果在序列尾部添加一个 1 后,和前面相连构成已经出现过的长为 n 的 01 子串,

则在序列尾部添加一个 0,否则在序列尾部添加一个 1。

  1. 序列若还不够 2n 项,则返回步骤 2。否则序列就是一个长度为 2n 次的 De Bruijn

序列。

SXYZ-6.27专题比赛的更多相关文章

  1. NOIP注意事项

    高精度 a.加法 b.减法 c.乘法(应该只会有高精乘单精)                                d.高精度除单精                 (后面c,d考的可能性较小 ...

  2. hdu3729 I'm Telling the Truth (二分图的最大匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=3729 I'm Telling the Truth Time Limit: 2000/1000 MS (Java/ ...

  3. Codeforces Round #378 (Div. 2) C D

    在实验室通宵 一边做水题一边准备随时躲起来以免被门卫大爷巡查发现..结果居然没来.. 本来以为可以加几分变个颜色..结果挂了CD...状态有点差...思维不太活跃 沉迷暴力不能自拔 D 给出n个长方体 ...

  4. Codeforces 1077E Thematic Contests(二分)

    题目链接:Thematic Contests 题意:给出n道有类型的题目,每天组织一场专题比赛,该天题目数量必须是前一天的2倍,第一天的题目数量可以任意选择,求能消耗的最多题目数量. 题解:先整理成不 ...

  5. Codeforces Round #521 (Div. 3)

    B 题过的有些牵强,浪费了很多时间,这种题一定想好思路和边界条件再打,争取一发过.  D 题最开始读错题,后面最后发现可以重复感觉就没法做了,现在想来,数据量大,但是数据范围小枚举不行,二分还是可以的 ...

  6. NOIP考纲总结+NOIP考前经验谈

    首先来一张图,很直观(截止到2012年数据) 下面是收集的一些,我改了一下 红色加粗表示特别重要,必须掌握 绿色加粗表示最好掌握,可能性不是很大,但是某些可以提高程序效率 高精度 a.加法 b.减法 ...

  7. NOIP前必须记住的30句话

    NOIP前必须记住的30句话 1.比赛前一天晚上请准备好你的各种证件,事先查好去往考场的路线2.比赛之前请先调整你的屏幕分辨率到你喜欢的大小3.比赛之前请把编译器的字体调为你平时惯用的字体,尤其是注意 ...

  8. NOIP考纲

    首先来一张图,很直观(截止到2012年数据) 下面是收集的一些,我改了一下 红色加粗表示特别重要,必须掌握绿色加粗表示最好掌握,可能性不是很大,但是某些可以提高程序效率 高精度 a.加法 b.减法 c ...

  9. NOIP2013,复赛及同步赛,报名及比赛,专题页面

    本通知的对象仅仅是福州第十九中学的学生 所有参加复赛以及同步赛的选手,请务必要仔细阅读:<关于CCF NOIP2013复赛有关事宜的通知>,里面有比赛的时间.地点.以及比赛费用的说明. 参 ...

  10. LeetCode专题-Python实现之第27题:Remove Element

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

随机推荐

  1. 洛谷P10693

    洛谷P10693 好奇怪的题目编号 思路提取 input 11 2 13 4 5 3 7 9 9 11 11 12 output 9 以人造数据为例. 首先我们让\(i\)\(\to\)\(a_i\) ...

  2. vue 拖拉改变盒子高度(mousedown、mousemove、mouseup)流畅不卡顿

    需求:上下两个盒子之间添加可拖拽按钮,实现高度变化 html: <textarea :id="'mycode'+(index*1+1)" :ref="'mycode ...

  3. html5 video标签 去掉边框黑线

    只需在样式中添加: mix-blend-mode: darken; 注意:IE和Edge浏览器不支持mix-blend-mode属性

  4. RIME:用交叉熵 loss 大小分辨 preference 是否正确 + 内在奖励预训练 reward model

    文章题目:RIME: Robust Preference-based Reinforcement Learning with Noisy Preferences,ICML 2024 Spotlight ...

  5. 利用Elasticsearch实现地理位置、城市搜索服务

    最近用到一些简单的地理位置查询接口,基于当前定位获取用户所在位置信息(省市区),然后基于该信息查询当前区域的......提供服务. 然后就自己研究了下GIS,作为一个程序员.自己能不能实现这个功能呢? ...

  6. Gymnasium 环境搭建

    [默认在链接公网环境]!!!! 一.      Conda虚拟环境搭建[安装则忽略] 1.1 检查本地适配python版本 >python -V 1.2根据版本下载并安装aconda[这里默认使 ...

  7. vue3 + ts 中出现 类型“typeof import(".........../node_modules/vue/dist/vue")”的参数不能赋给类型“Component<any, any, any, ComputedOptions, MethodOptions>”的参数。

    错误示例截图 解决方法 修改shims-vue.d.ts中的内容 declare module "*.vue" { import { defineComponent } from ...

  8. 2024年世界体育界的第一大丑闻:利昂内尔·梅西 (The biggest scandal in the world of sports in 2024: Unethical player - Lionel Messi.)

    无德球员,梅西亲日辱华,不顾球迷感受,拒绝在中国的比赛中上场,并以所谓的伤病为借口,却在3天后的日本比赛中完全恢复如初,并进行了30分钟的高强度的对抗比赛并射门,可以说梅西的这一行径就是对中国亿万百姓 ...

  9. 拜登开始在YouTube上打竞选广告了 —— 美国总统的竞选广告已经开始媒体投放了

    哈哈哈,老拜登,跑到YouTube上打广告了,这个画面真的太难想象,如果美国有"椰树"广告,估计拜登能弄个泳装上去打广告.有时不得不佩服西方搞的这种全民选举,最后搞的就和看小品似的 ...

  10. OSI 七层网络模型和 TCP/IP 四层网络模型

    OSI 七层网络模型 网络的七层架构从下到上主要分为:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层 物理层主要定义物理设备标准,它的主要作用是传输比特流,具体做法是在发送端将 1.0 码 ...