https://www.cnblogs.com/31415926535x/p/11460682.html

上午没课,做一套题,,练一下手感和思维,,教育场的71 ,,前两到没啥,,后面就做的磕磕巴巴的,,,有想法但是不敢实现,,自我否定,,没了思路就只能官方题解,,发现其实都很简单,,,思维场把,,,,

A There Are Two Types Of Burgers

贪心就完事了,,推出公式不知道怎么证明是最优的,,,(敲错变量还wale一发emmm

#include <bits/stdc++.h>
#define aaa cout<<233<<endl;
#define endl '\n'
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
// mt19937 rnd(time(0));
const int inf = 0x3f3f3f3f;//1061109567 > 1e9
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-7;
const double pi = 3.14159265358979;
const int maxn = 1e5 + 5;
const int maxm = 1e3 + 5;
const int mod = 1e9 + 7; int main()
{
// double pp = clock();
// freopen("233.in", "r", stdin);
// freopen("233.out", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0); int t; cin >> t;
while(t--)
{
int b, p, f;
cin >> b >> p >> f;
int h, c;
cin >> h >> c;
int ans = 0;
if(h < c)
{
ans = c * (min(f, b / 2));
b -= 2 * min(f, b / 2);
ans += h * (min(p, b / 2));
}
else
{
ans = h * min(p, b / 2);
b -= 2 * min(p, b / 2);
ans += c * min(f, b / 2);
}
cout << ans << endl; } // cout << endl << (clock() - pp) / CLOCKS_PER_SEC << endl;
return 0;
}

B Square Filling

题意就是给你一个矩形,,由0,1组成,然后一次可以进行一个操作:把 \((x, y), (x, y + 1), (x + 1, y), (x + 1, y + 1)\) 这几个点变成1,,然后问你从一个全零的矩阵变成这个矩阵的操作方法,,没限制操作次数,,那就乱搞就行了,,

#include <bits/stdc++.h>
#define aaa cout<<233<<endl;
#define endl '\n'
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
// mt19937 rnd(time(0));
const int inf = 0x3f3f3f3f;//1061109567 > 1e9
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-7;
const double pi = 3.14159265358979;
const int maxn = 1e3 + 5;
const int maxm = 1e3 + 5;
const int mod = 1e9 + 7; int a[maxn][maxn];
vector<pair<int, int> > ans;
bool check(int x, int y)
{
if(a[x][y] && a[x][y + 1] && a[x + 1][y] && a[x + 1][y + 1])return true;
return false;
}
int main()
{
// double pp = clock();
// freopen("233.in", "r", stdin);
// freopen("233.out", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0); int n, m;cin >> n >> m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
cin >> a[i][j]; for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= m; ++j)
{
if(!a[i][j])continue;
if(check(i, j))ans.push_back(make_pair(i, j));
else if(check(i, j - 1))ans.push_back(make_pair(i, j - 1));
else if(check(i - 1, j))ans.push_back(make_pair(i - 1, j));
else if(check(i - 1, j - 1))ans.push_back(make_pair(i - 1, j - 1));
else
{
cout << -1 << endl;
return 0;
}
}
}
sort(ans.begin(), ans.end());
int size = unique(ans.begin(), ans.end()) - ans.begin();
cout << size << endl;
for(int i = 0; i < size; ++i)cout << ans[i].first << " " << ans[i].second << endl; // cout << endl << (clock() - pp) / CLOCKS_PER_SEC << endl;
return 0;
}

C Gas Pipeline

dp?! 没怎么训练过dp,,暂时扔了,,

D Number Of Permutations

感觉这道题不错,,

题意就是对于给你的一个二元对 序列s,,他的排列中任意一维满足不递减的排列就是 坏的排列,问你所有的排列中好的共有几种,,

一开始被tag的组合吓懵了,,以为是什么推公式的排列组合题,,

其实解法很简单,,考虑反面就行了,,,总的排列的情况一共有 \(fac[n]\) 种,,然后对于第一维不递减的排列的个数记为 \(cnt_1\) ,同理第二维的就是 \(cnt_2\) ,,根据容斥的思想,,还有它俩的交集 \(cnt_{12}\) ,,最后他们的答案就是 \(fac[n] - cnt_1 - cnt_2 + cnt_{12}\) ,,,

前两种的求法就是排序后,,如果没有重复的元素,那就就是一种情况,,如果有重复的元素,,那么就是重复元素的阶乘的积,,

对于最后这种交集的情况,首先要按第一维排序,如果第一维相等,按第二维排序,,,然后判断第二维是不是不递减的,,如果不是不递减的,,那么这种情况就是0种,,否者的话,,对于那些相同的二元对就可以互换位置,,那么答案就是他们的阶乘的积,,

最后统计答案就行了,,记得多加几个模,,因为前两种的情况可能很多,,,emmmm,,,wa了好几发,,,

#include <bits/stdc++.h>
#define aaa cout<<233<<endl;
#define endl '\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
// mt19937 rnd(time(0));
const int inf = 0x3f3f3f3f;//1061109567 > 1e9
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-7;
const double pi = 3.14159265358979;
const int maxn = 3e5 + 5;
const int maxm = 1e3 + 5;
// const int mod = 1e9 + 7;
const int mod = 998244353; pair<int, int> a[maxn];
bool cmpab(pair<int, int> i, pair<int, int> j)
{
if(i.first == j.first)return i.second < j.second;
return i.first < j.first;
}
bool cmpb(pair<int, int> i, pair<int, int> j)
{
return i.second < j.second;
}
ll fac[maxn];
void init()
{
fac[0] = fac[1] = 1;
for(int i = 2; i < maxn; ++i)fac[i] = fac[i - 1] * i % mod;
}
int main()
{
// double pp = clock();
// freopen("233.in", "r", stdin);
// freopen("233.out", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0); int n; cin >> n;
for(int i = 1; i <= n; ++i)cin >> a[i].first >> a[i].second;
sort(a + 1, a + 1 + n, cmpab);
ll cnt1, cnt2, cnt12;
cnt1 = cnt2 = cnt12 = 1;
init();
for(int i = 1; i <= n; ++i)
{
int l = i, r = n;
int k = i;
while(l <= r)
{
int mid = l + r >> 1;
if(a[mid].first == a[i].first)
{
l = mid + 1;
k = mid;
}
else
{
r = mid - 1;
}
}
cnt1 = cnt1 * fac[k - i + 1] % mod;
i = k;
}
bool flag = true;
for(int i = 1; i <= n; ++i)if(a[i].second < a[i - 1].second)flag = false;
if(flag)
{
for(int i = 1; i <= n; ++i)
{
int l = i, r = n;
int k = i;
while(l <= r)
{
int mid = l + r >> 1;
if(a[mid].first == a[i].first && a[mid].second == a[i].second)
{
l = mid + 1;
k = mid;
}
else
{
r = mid - 1;
}
}
cnt12 = cnt12 * fac[k - i + 1] % mod;
i = k;
}
}
else
{
cnt12 = 0;
} sort(a + 1, a + 1 + n, cmpb);
for(int i = 1; i <= n; ++i)
{
int l = i, r = n;
int k = i;
while(l <= r)
{
int mid = l + r >> 1;
if(a[mid].second == a[i].second)
{
l = mid + 1;
k = mid;
}
else
{
r = mid - 1;
}
}
cnt2 = cnt2 * fac[k - i + 1] % mod;
i = k;
}
// cout << fac[n] << " " << cnt1 << " " << cnt2 << " " << cnt12 << endl;
if(n != 1)cout << (fac[n] - cnt1 - cnt2 + cnt12 + mod * 2) % mod << endl;
else cout << 0 << endl; // cout << endl << (clock() - pp) / CLOCKS_PER_SEC << endl;
return 0;
}

E XOR Guessing

一道简单的交互题,,,

题意就是你有两次询问机会,,每次询问是100 个数,,然后交互器会选择一个数和答案 \(x\) 的异或作为输入给你,,最后你要得出答案那个数,,,

看到异或,第一反应就是位运算相关的,,,往上靠就行了,,只有两次机会的话,,而且书的范围是14位内的正整数,,,所以考虑第一次询问 \(x\) 的高7位,,后一次询问低7位,,,然后将得到的值掐掉前面的低7位,,“并” 上后面掐掉高7位的值就行了,,,

忘记将 #define '\n' endl 注释ile了一发,,,emmmmm

#include <bits/stdc++.h>
#define aaa cout<<233<<endl;
// #define endl '\n'
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
// mt19937 rnd(time(0));
const int inf = 0x3f3f3f3f;//1061109567 > 1e9
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-7;
const double pi = 3.14159265358979;
const int maxn = 1e3 + 5;
const int maxm = 1e3 + 5;
const int mod = 1e9 + 7; int main()
{
// double pp = clock();
// freopen("233.in", "r", stdin);
// freopen("233.out", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0); cout << "? ";
for(int i = 1; i <= 100; ++i)cout << i << " ";cout << endl;fflush(stdout);
ll a; cin >> a;
cout << "? ";
for(int i = 1; i <= 100; ++i)cout << (i << 7) << " "; cout << endl;fflush(stdout);
ll b; cin >> b;
// cout << a << b << endl;
a = a & (0b11111110000000);
b = b & (0b00000001111111);
cout << "! " << (a | b) << endl;fflush(stdout); // cout << endl << (clock() - pp) / CLOCKS_PER_SEC << endl;
return 0;
}

F Remainder Problem

这题也不错,,

题意就是一个长为500000的数组,,一个操作是对 第x位 a[x] += y;另一种操作是询问所有 模x余数为y位置处的数的和,,,

自己想的做法T了,,,因为没有想到 修改一个数他所会影响的可能询问该怎么表示,,,,

这题的解法是: 用一个数组 \(sum[x][y]\) 保存模为x时余数时y的答案,,因为当模数很大时,,我们即使时暴力找,,因为这时的数很少,,,所以询问不怎么费时间,,,但是数小时,,,寻找的数就很多,,,这样就会T,,,所以我们只保存前750个模数的答案,,,

每次修改一个数 \(a[x] += y\) 后,,,对于所有 \(sum[i][x \% i]\) 都会产生影响,,,这里的i就是模数,,,\(x \% i\) 相当于是这个模数下的余数,,当询问 \((2, i, x \% i)\) 时,,,这个答案就可以直接得到,,,

比如说我修改 a[7] 的值,,那么对于一个询问 \((x, y)={(3, 1), (4, 3), (5, 2)......}\) 这些询问的值一定会改变,,,也就是对 \(sum[3][1], sum[4][7 \% 4], sum[5][7 \% 5]\) 进行了修改,,

思路理清代码就简单了,,,

#include <bits/stdc++.h>
#define aaa cout<<233<<endl;
#define endl '\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
// mt19937 rnd(time(0));
const int inf = 0x3f3f3f3f;//1061109567 > 1e9
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-7;
const double pi = 3.14159265358979;
const int maxn = 5e5 + 5;
const int maxm = 1e3 + 5;
const int mod = 1e9 + 7; int a[maxn];
const int k = 750;
int sum[k][k];
int main()
{
// double pp = clock();
// freopen("233.in", "r", stdin);
// freopen("233.out", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0); int q; cin >> q;
int o, x, y;
while(q--)
{
cin >> o >> x >> y;
if(o == 1)
{
a[x] += y;
for(int i = 1; i < k; ++i)sum[i][x % i] += y;
}
else
{
if(x >= k)
{
int ans = 0;
for(int i = y; i <= 500000; i += x)ans += a[i];
cout << ans << endl;
}
else
{
cout << sum[x][y] << endl;
} } } // cout << endl << (clock() - pp) / CLOCKS_PER_SEC << endl;
return 0;
}

G Indie Album

貌似是AC自动机的题,,,没开字符串的专题,,先扔了,,,

(end...)

Educational Codeforces Round 71的更多相关文章

  1. Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块

    Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块 [Problem Description] ​ ...

  2. Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题

    Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题 [Problem Description] ​ 总共两次询 ...

  3. Educational Codeforces Round 71 (Rated for Div. 2)E. XOR Guessing

    一道容斥题 如果直接做就是找到所有出现过递减的不同排列,当时硬钢到自闭,然后在凯妹毁人不倦的教导下想到可以容斥做,就是:所有的排列设为a,只考虑第一个非递减设为b,第二个非递减设为c+两个都非递减的情 ...

  4. Educational Codeforces Round 71 (Rated for Div. 2) E XOR Guessing (二进制分组,交互)

    E. XOR Guessing time limit per test1 second memory limit per test256 megabytes inputstandard input o ...

  5. [暴力] Educational Codeforces Round 71 (Rated for Div. 2) B. Square Filling (1207B)

    题目:http://codeforces.com/contest/1207/problem/B   B. Square Filling time limit per test 1 second mem ...

  6. [贪心,dp] Educational Codeforces Round 71 (Rated for Div. 2) C. Gas Pipeline (1207C)

    题目:http://codeforces.com/contest/1207/problem/C   C. Gas Pipeline time limit per test 2 seconds memo ...

  7. Educational Codeforces Round 71 (Rated for Div. 2)

    传送门 A.There Are Two Types Of Burgers 签到. B.Square Filling 签到 C.Gas Pipeline 每个位置只有"高.低"两种状 ...

  8. Educational Codeforces Round 71 (Rated for Div. 2) Solution

    A. There Are Two Types Of Burgers 题意: 给一些面包,鸡肉,牛肉,你可以做成鸡肉汉堡或者牛肉汉堡并卖掉 一个鸡肉汉堡需要两个面包和一个鸡肉,牛肉汉堡需要两个面包和一个 ...

  9. Remainder Problem(分块) Educational Codeforces Round 71 (Rated for Div. 2)

    引用:https://blog.csdn.net/qq_41879343/article/details/100565031 下面代码写错了,注意要上面这种.查:2  800  0,下面代码就错了. ...

随机推荐

  1. [Algorithm] BFS vs DFS

    //If you know a solution is not far from the root of the tree: BFS, because it is faster to get clos ...

  2. [CSS] prefers-reduced-motion

    The prefers-reduced-motion CSS media feature is used to detect if the user has requested that the sy ...

  3. [转贴] bu AU3脚本录制工具(软件自动化安装的最简便的方法)

    http://www.autoitx.com/thread-15419-1-1.html 1,打开一个.au3的文档或者新建一个.au3的文档,用SciTE编辑; 2,按下ALT+F6,弹出下面的对话 ...

  4. vue 项目的文件/文件夹上传下载

    前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对 Http 协议较模糊,故这次采用渐进的方式来学习文件上传的原理与实践. ...

  5. 16-ESP8266 SDK开发基础入门篇--TCP 服务器 非RTOS运行版,串口透传(串口回调函数处理版)

    https://www.cnblogs.com/yangfengwu/p/11105466.html 其实官方给的RTOS的版本就是在原先非RTOS版本上增加的 https://www.cnblogs ...

  6. 洛谷 P4071 [SDOI2016]排列计数 题解

    P4071 [SDOI2016]排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳 ...

  7. 微信小程序 Flex局部元素被挤压问题

    关于Flex布局不在此处赘述,需要了解的可以查阅官方文档:基本的布局方法——Flex布局 当使用Flex布局,想实现如下图1的效果时,代码编写如下: 图1: <!-- wxml文件 --> ...

  8. fastq 转换为 fasta

    使用 awk awk '{if(NR%4 == 1){print ">" substr($0, 2)}}{if(NR%4 == 2){print}}' XXX.fastq & ...

  9. rust字符串的slice

    fn main() { let s = String::from("hello dj"); //字符串字面值实际就是字符串的切片,所以 let ss ="hello dj ...

  10. 20189220 余超《Linux内核原理与分析》第二周作业

    计算机如何工作的 一.存储程序计算机工作模型 冯诺依曼体系结构:核心思想为存储程序计算机.两个层面: (1)硬件的角度(计算机主板):一个CPU,一块内存,之间有总线连接.CPU内部有一个IP计算器, ...