被虐惨了,实验室里数十位大佬中的一位闲来无事切题(二,然后出了5t,当然我要是状态正常也能出5,主要是又热又有蚊子什么的...

题都挺水的。包括F题。

A:

  略

B:

  找k个最大的数存一下下标然后找段长度就行

  public static void main(String[] args) {
int n = nextInt();
int k = nextInt();
PriorityQueue<Integer> q = new PriorityQueue<>();
int a[] = new int[n];
for(int i=0;i<n;i++){
a[i] = nextInt();
q.add(a[i]);
}
while (q.size()>k){
q.poll();
}
boolean b[] = new boolean[n];
int sum = 0;
int last = 0;
for(int i=n-1;i>=0;i--){
if (q.contains(a[i])){
last=i>last?i:last;
sum+=a[i];
b[i] = true;
q.remove(a[i]);
}
}
out.println(sum);
int temp = -1;
for(int i=0;i<last;i++){
if (b[i]){
out.print(i-temp+" ");
temp = i;
}
}
out.print(n-1-temp);
out.flush();
}

main 方法

C:

  从两个端点向中间遍历

 public static void main(String[] args) {
int n = nextInt();
long d[] = new long[n];
for(int i=0;i<n;i++){
d[i] = nextInt();
}
long sum1 = 0;
long sum3 = 0;
int i=0,j=n-1;
long ans = 0;
while (j>i){
if (sum3==sum1){
ans = sum1>ans?sum1:ans;
sum3+=d[j];
sum1+=d[i];
i++;j--;
if (sum3==sum1)
ans = sum1>ans?sum1:ans;
}else if (sum3<sum1){
sum3+=d[j];
j--;
}else if (sum3>sum1){
sum1+=d[i];
i++;
}
}
if (j==i){
if (sum3<sum1){
sum3+=d[j];
}else if (sum3>sum1){
sum1+=d[i];
}
if (sum3==sum1)
ans = sum1>ans?sum1:ans;
}
out.print(ans);
out.flush();
}

D:

  大水题,四个位置上的元素判断一下情况就行,我直接分的类很莽就不放代码了。

E:

  求出dfs序,顺手存个子树大小,结点下标就完了。

package R498;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.util.Vector; public class Main4 {
static BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tok;
static boolean hasNext()
{
while(tok==null||!tok.hasMoreTokens())
try{
tok=new StringTokenizer(in.readLine());
}
catch(Exception e){
return false;
}
return true;
}
static String next()
{
hasNext();
return tok.nextToken();
}
static long nextLong()
{
return Long.parseLong(next());
}
static int nextInt()
{
return Integer.parseInt(next());
}
static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out)); static int N = 200005;
static Vector<Integer> g[] = new Vector[N];
static int size[] = new int[N];//存子树大小
static boolean b[] = new boolean[N];//染色
static int ans[] = new int[N];//dfs序
static int index[] = new int[N];//下标
static int pos = 0; public static void main(String[] args) {
int n = nextInt();
int q = nextInt();
for(int i=1;i<=n;i++){
g[i] = new Vector<>();
}
int u;
for(int i=2;i<=n;i++){
u = nextInt();
g[u].add(i);
}
dfs(1);
int t,k;
while (q--!=0){
t = nextInt();
k = nextInt();
if (k>size[t]){
out.println(-1);
}else {
out.println(ans[index[t]+k-1]);
}
}
out.flush();
}
public static void dfs(int v){
b[v]=true;
size[v]++;
ans[pos++] = v;
index[v] = pos-1;
for(int i=0;i<g[v].size();i++){
int u = g[v].get(i);
if(!b[u]){
dfs(u);
size[v]+=size[u];
}
}
}
}

F:很显然上来就想到了从两个点往中间搜搜一半,但是我写炸了,就找了份代码看了看,对于 “一半”,这个地方  要用 (n/2+m/2)而不是 (n+m)/2  ,ex:1 1 10 10.

还是很好懂的 ,哦还需要知道这么一个事, a^b=c 的话 那么 b^c=a; 原谅我是二进制小白,有几个相关公式可以直接百度

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.*; public class Main6 {
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tok;
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); static boolean hasNext() {
while (tok == null || !tok.hasMoreTokens())
try {
tok = new StringTokenizer(in.readLine());
} catch (Exception e) {
return false;
}
return true;
} static String next() {
hasNext();
return tok.nextToken();
} static long nextLong() {
return Long.parseLong(next());
} static int nextInt() {
return Integer.parseInt(next());
} static int n;
static int m;
static long k;
static long ans = 0;
static long a[][];
static Map<Long,Long> map[][];
public static void main(String[] args) {
n = nextInt();
m = nextInt();
k = nextLong();
a = new long[n][m];
map = new Map[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
a[i][j] = nextLong();
map[i][j] = new HashMap<>();
}
}
dfsbe(0,0,0);
dfsend(n-1,m-1,0); out.print(ans);
out.flush();
}
public static void dfsbe(int i,int j,long temp){
if (i>=n||j>=m)
return;
temp ^= a[i][j];
if (i+j==n/2+m/2){
if (map[i][j].get(temp)==null){
map[i][j].put(temp,1l);
}else {
map[i][j].put(temp,map[i][j].get(temp)+1);
}
return;
}
dfsbe(i+1,j,temp);
dfsbe(i,j+1,temp);
}
public static void dfsend(int i,int j,long temp){
if (i<0||j<0)
return;
if (i+j==n/2+m/2){
long num = temp^k;
if (map[i][j].get(num)!=null){
ans+=map[i][j].get(num);
}
return;
}
temp^=a[i][j];
dfsend(i-1,j,temp);
dfsend(i,j-1,temp);
}
}
/**
* 1^1=0
* 0^0=0
* 1^0=1
* 0^1=1
* a ^ b = b ^ a
* a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
* d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
* a ^ b ^ a = b.
*/

  

Codeforces Round #498 (Div. 3)的更多相关文章

  1. CodeForces Round #498 Div.3 A. Adjacent Replacements

    http://codeforces.com/contest/1006/problem/A Mishka got an integer array aa of length nn as a birthd ...

  2. Codeforces Round #498 (Div. 3) 简要题解

    [比赛链接] https://codeforces.com/contest/1006 [题解] Problem A. Adjacent Replacements        [算法] 将序列中的所有 ...

  3. Codeforces Round #498 (Div. 3)--E. Military Problem

    题意问,这个点的然后求子树的第i个节点. 这道题是个非常明显的DFS序: 我们只需要记录DFS的入DFS的时间,以及出DFS的时间,也就是DFS序, 然后判断第i个子树是否在这个节点的时间段之间. 最 ...

  4. Codeforces Round #498 (Div. 3) E. Military Problem (DFS)

    题意:建一颗以\(1\)为根结点的树,询问\(q\)次,每次询问一个结点,问该结点的第\(k\)个子结点,如果不存在则输出\(-1\). 题解:该题数据范围较大,需要采用dfs预处理的方法,我们从结点 ...

  5. Codeforces Round #498 (Div. 3) D. Two Strings Swaps (思维)

    题意:给你两个长度相同的字符串\(a\)和\(b\),你可以将相同位置上的\(a\)和\(b\)的字符交换,也可以将\(a\)或\(b\)中某个位置和对应的回文位置上的字符交换,这些操作是不统计的,你 ...

  6. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  7. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  8. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  9. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

随机推荐

  1. Elastic{ON}参会随手记

    Elastic{ON} 同事送了一张Elastic{ON}的票,因为我们的产品中用到的ELK全家桶,实话说用的体量还挺大的,因此非常想去参加这次的发布会. 7.0的新特性 上午的会议是来自总部的一名工 ...

  2. 14、Spark的核心术语

    Application:spark应用程序,就是用户基于spark api开发的程序,一定是通过一个有main方法的类执行的,比如java开发spark,就是在eclipse中,建立的一个工程 App ...

  3. [Chrome插件] SelectJd(京东自营筛选器) v1.0.0 发布

    如今京东的商品列表已经没有"自营"筛选了,只有"京东物流"筛选.导致找商品时不方便. 于是我开发了一下Chrome插件--SelectJd(京东自营筛选器). ...

  4. 查看SQL Server的版本及License

    select @@VERSION Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 Copyri ...

  5. C# 调用线程并行上下文穿透-ILogicalThreadAffinative+CallContext

    na mespace System.Runtime.Remoting.Messaging { /// <summary>Provides a set of properties that ...

  6. std::nothrow 的使用心得

    std::nothrow 意思是说,不要跑出异常,改为返回一个nullptr. 一般的使用场景是,建议new的时候使用,避免使用try-catch来捕捉异常. 比如: float m_words = ...

  7. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)

    Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer   Advanced Installer :Free for 30 da ...

  8. C语言截取从某位置开始指定长度子字符串方法

    c语言标准库没有截取部分字符串的函数,为啥?因为用现有函数strncpy,很容易做到! ] = {""}; "}; strncpy(dest, src, ); puts( ...

  9. cx_oracle访问处理oracle中文乱码问题

    cx_oracle访问处理oracle中文乱码问题 问题描述 使用docker打包了centos镜像,编码为gbk,随后访问oracle出现了很多乱码.其原因自然是因为编码不一致,服务器为zhs16g ...

  10. 一分钟内搭建全web的API接口神器json-server详解

    JSON-Server 是一个 Node 模块,运行 Express 服务器,你可以指定一个 json 文件作为 api 的数据源. 安装json-server npm install -g json ...