Java順序查詢、二分查詢
阿新 • • 發佈:2020-07-18
A
根據性質,\(a,b,c\) 中的最大值一定會在 $x,y,z $ 中出現兩次
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; int a[3]; while(t --) { memset(a,0,sizeof a); for(int i = 0;i < 3; ++i) cin >> a[i]; sort(a,a + 3); if(a[1] != a[2]) cout << "NO" << endl; else { cout << "YES\n" << a[0] << ' ' << a[0] << ' ' << a[1] << endl; } } return 0; }
C
題意 :去除一個數組的最短字首使得餘下的陣列每次從首或尾部取元素可以排為非降序列
每次從首尾取元素,組成非降序列的話,首位肯定是最小的,中間肯定是最大的,
所以,只要從尾部開始找到一組形如 $a_1\leq a_2\leq \dots\leq a_{max}\geq \dots\geq a_{k-1}\geq a_k $ 這樣的序列即可
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; int n; while(t --) { cin >> n; vector<int> a(n); int pos = n - 1; for(int i = 0;i < n; ++i) cin >> a[i]; while(pos > 0 && a[pos - 1] >= a[pos]) -- pos; while(pos > 0 && a[pos - 1] <= a[pos]) -- pos; cout << pos << endl; } return 0; }
參考
https://codeforces.com/blog/entry/80257
D
- string 遞迴拷貝的時候,要加 const
每次都是對半分字元遞增,計算每個半區域有多少不同的字元即可,然後左右兩邊取 \(min\) 返回
#include <bits/stdc++.h> using namespace std; int calc(const string &s,char c) { if(s.size() == 1) return s[0] != c; int mid = s.size() / 2; int cntl = calc(string(s.begin(), s.begin() + mid), c + 1); cntl += mid - count(s.begin() + mid,s.end(),c); int cntr = calc(string(s.begin() + mid, s.end()), c + 1); cntr += mid - count(s.begin(),s.begin() + mid,c); return min(cntl,cntr); } int main() { int t; cin >> t; while(t --) { string s; int n; cin >> n >> s; cout << calc(s,'a') << endl; } return 0; }
參考
https://codeforces.com/blog/entry/80257
E
先把有向邊連上,跑一遍topsort,在這個過程中,記錄每個點的優先順序大小,因為無向邊沒有連,所以他們也會進隊跑一遍,
但是不用擔心,因為這些無向邊都是一組的,不管怎麼跑,永遠不可能比有向邊的權值大,如果最後topsort跑成環,輸出 \(NO\)
否則,就按權值大小,小的點連到大的點上即可
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
typedef pair<int,int> PII;
int e[N],ne[N],h[N],idx,d[N],n,m,top[N],cnt;
void add(int a,int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
bool topsort() {
queue<int> q;
int t;
for(int i = 1;i <= n; ++i) {
if(d[i] == 0) q.push(i);
}
while(q.size()) {
t = q.front();
top[t] = cnt ++;// 記錄每個topsort的優先值大小
q.pop();
for(int i = h[t]; ~i;i = ne[i]) {
int j = e[i];
d[j] --;
if(d[j] == 0) q.push(j);
}
}
if(cnt < n) return 0;
else return 1;
}
int main() {
// freopen("in.txt","r",stdin);
int t;
cin >> t;
while(t --) {
idx = 0;
cnt = 1;
memset(h,-1,sizeof h);
memset(e,0,sizeof e);
memset(ne,0,sizeof ne);
memset(d,0,sizeof d);
memset(top,0,sizeof top);
int op,u,v;
cin >> n >> m;
vector<PII> vec;
for(int i = 0;i < m; ++i) {
cin >> op >> u >> v;
vec.push_back({u,v});
if(op == 1) {
add(u,v);
d[v] ++;
}
}
if(topsort() == 0) {
cout << "NO" << endl;
}
else {
cout << "YES" << endl;
for(int i = 0;i < m; ++i) {
int &u = vec[i].first,&v = vec[i].second;
if(top[u] > top[v]) swap(u,v);
cout << u << ' ' << v << endl;
}
}
}
return 0;
}
參考